首页

文章

什么是java代理模式,具体相关的动态代理和静态代理分别是什么?举例更好啦~

发布网友 发布时间:2022-03-24 06:11

我来回答

3个回答

懂视网 时间:2022-03-24 10:32

动态代理和静态代理的区别如下:

  

  1、静态代理业务类只需要关注业务逻辑本身,保证了业务类的重用性。代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,需要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度。

  

  2、动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandler invoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一,复用性更强。

  

  

热心网友 时间:2022-03-24 07:40

简单的例子: HelloSpeaker.java

import java.util.logging.*;

public class HelloSpeaker {
private Logger logger = Logger.getLogger(this.getClass().getName());

public void hello(String name) {

logger.log(Level.INFO, "hello method starts...."); //日志记录
System.out.println("Hello, " + name); //!!!!!!!!!!!

logger.log(Level.INFO, "hello method ends...."); //日志记录
}
}

HelloSpeaker在执行hello()方法时,我们希望能记录该方法已经执行以及结束,
最简单的作法就是如上在执行的前后加上记录动作,然而Logger介入了HelloSpeaker中,
记录这个动作并不属于HelloSpeaker,这使得HelloSpeaker的职责加重。

------------------------------------------------------------------------------------------
怎么办,用下面的方法或许好一些:

先定义一个接口:

public interface IHello {
public void hello(String name);
}
------------------------------------------------------------------------------------------
实现该接口

public class HelloSpeaker implements IHello {
public void hello(String name) {
System.out.println("Hello, " + name);
}
}

public class Greeting implements IHello{
public void hello(String name){
System.out.println("Greeting, " + name);
}
}
------------------------------------------------------------------------------------------
实现一个代理对象: HelloProxy

import java.util.logging.*;
public class HelloProxy implements IHello {
private Logger logger = Logger.getLogger(this.getClass().getName());
private IHello helloObject; //被代理对象

public HelloProxy(){}

public HelloProxy(IHello helloObject) {
this.helloObject = helloObject; //把被代理对象传入
}

public void setHelloObject(IHello helloObject){
this.helloObject = helloObject;
}

public IHello getHelloObject(){
return this.helloObject;
}

public void hello(String name) {
logger.log(Level.INFO, "hello method starts...."); //日志记录

helloObject.hello(name); //!!!!!!!!调用被代理对象的方法

logger.log(Level.INFO, "hello method ends...."); //日志记录
}
}

-----------------------------------------------------------------------------------------------------
执行:

IHello helloProxy = new HelloProxy(new HelloSpeaker()); //生成代理对象, 并给它传入一个被代理的对象
helloProxy.hello("world");

//IHello h=factory.getBean("hello"); // IoC
//h.hello("world");

IHello helloProxy = new HelloProxy(new Greeting()); //生成代理对象, 并给它传入一个被代理的对象
helloProxy.hello("world");

-----------------------------------------------------------------------------------------------------

代理对象HelloProxy将代理真正的HelloSpeaker来执行hello(),并在其前后加上记录的动作,
这使得我们的HelloSpeaker在写时不必介入记录动作,HelloSpeaker可以专心于它的职责。

  这是静态代理的基本范例,然而,代理对象的一个接口只服务于一种类的对象,而且如果要代理的方法很多,
我们势必要为每个方法进行代理,静态代理在程序规模稍大时就必定无法胜任.

Java在JDK 1.3之后加入协助开发动态代理功能的类,我们不必为特定对象与方法写特定的代理,使用动态代理,
可以使得一个handler服务于各个对象,首先,一个handler必须实现java.lang.reflect.InvocationHandler:

import java.util.logging.*;
import java.lang.reflect.*;

public class LogHandler implements InvocationHandler { //
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate; //被代理的对象

public Object bind(Object delegate) { //自定义的一个方法,用来绑定被代理对象的,返回值为被代理方法的返回值
this.delegate = delegate;
return Proxy.newProxyInstance(
delegate.getClass().getClassLoader(),
delegate.getClass().getInterfaces(),
this); //通过被代理的对象生成它的代理对象, 并同handler绑定在一起
}

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
try {
logger.log(Level.INFO, "method starts..." + method); //日志记录
result = method.invoke(delegate, args); //!!!!!!!!调用被代理对象的方法
logger.log(Level.INFO, "method ends..." + method); //日志记录
} catch (Exception e){
logger.log(Level.INFO, e.toString());
}
return result;
}
}
InvocationHandler的invoke()方法会传入被代理对象的方法名称与参数, 实际上要执行的方法交由method.invoke(),
并在其前后加上记录动作,method.invoke()返回的对象是实际方法执行过后的回传结果。

动态代理必须有接口:
public interface IHello {
public void hello(String name);
}

实现该接口:
public class HelloSpeaker implements IHello {
public void hello(String name) {
System.out.println("Hello, " + name);
}
}

执行:
LogHandler logHandler = new LogHandler();
IHello helloProxy = (IHello) logHandler.bind(new HelloSpeaker()); //传入被代理对象, 传回代理对象
helloProxy.hello("Justin");

热心网友 时间:2022-03-24 08:58

class a
{
void a1(){System.out.print("a");}
}

class b
{
b()
{
a aa =new a();
}
void b1()
{
aa.a1();
}
}
上边里例子就是一个简单的代理模式 在b中建立一个a的对象 然后b的b1方法里调研a的a1方法
你只要实例化话一个b的对象的话 调用这个对象的b1方法就和调研a对象的a1方法的效果是完全一样的
动态代理的话就是在
b()
{
a aa =new a();
}
这个构造参数传进一个参数 根据这个参数来产生不同的对象(这里一般要用到工厂模式)
根据产生对象的不同调研的方法肯定也就不一样了
宝石花的养殖方法介绍 宝石花怎么养才长得好 不想让老婆看到我电脑里的一些东西怎么办? 桥好路由器停电后在来电老是获取lp 勒索病毒加密的文件如何恢复? TPU贴合膜多少钱 华为手机如何将输入法改为简体 肉丝炒金针菇做法 仓储冷链信息怎么申报 什么是药品冷链物流 浙江食品冷链运输多少钱 生物冷链具备什么资质 投诉检测站最有效办法 冢君的解释 304C型钢厂 真诚推荐 永浩供 乌鲁木齐球墨铸铁厂家排名 2023年抖音618好物节招商规则 2023年抖音好物年货节好物直播间玩法说明 抖音2023好物年货节玩法攻略 互联网内容平台——小红书的优势与困境 ...女儿房间的空调洗一下滤网,问一下格力小金豆空调面罩怎么打开... 传真机和打印机有什么区别? 传真纸和打印纸哪个好 传真纸和复印纸哪个好 虚拟语气as though 的问题 We didn't know his telephone number, otherwise we would have teleph... 我想问一下 错综复杂条件句 那怎么不能使用在这里 if i can do this... 好可怕...好可怕的梦... 线束组装线束组装工艺要求 汽车线束英语翻译 带表卡尺怎么读数 带表卡尺的使用方法 压力变送器数显表 公主连结凯露表情包大全 臭鼬表情包图片一览[多图] 单眼皮怎么使用双眼皮贴? 咬人的那特小的虫子叫什么 Bose音响怎么连接蓝牙 博士音响蓝牙怎么连接 夹了一片菜叶,上面摆了七根鱼刺和在碗里放了七个汤勺,每个汤勺里放一根... 微信聊天记录怎么才能彻底删除?通过这几种操作可以确保隐私安全!_百度... IDM IDMShellExt64.dll无法删除 - 删除使用中的(进程相关或残留)文件... 写关于活动的句子100字 社区团购运营思路和实战有啥收获写100字 备忘录在手机的哪里 刚性消费有哪些 中国经济快速增长的原因 什么是刚性消费 什么叫刚性增长 特别精辟的个性签名(非常经典的个性句子) 特别经典的个性签名(非常惊艳的个性句子) 文艺范十足的个性签名(温柔治愈的个性签名句子) wps文字怎么设置每页头和尾 27岁的女人需要补充哪些营养元素 Java中的动态代理相对于静态代理有何优点? 静态代理,JDK动态代理和CGLib动态代理之前的区别 动态IP和静态IP的区别是什么? Java动态代理和静态代理的区别 Java动态代理与静态代理的定义与区别?? java静态代理与动态代理的区别 苹果xr闪退在上海黄浦区五福弄附近哪里能维修? 苹果XR为什么一打开王者一点就退是什么原因? IphoneXR昨天升级ios13后,微信qq闪退打不开怎么办 苹果Xr打开软件闪退提示已损坏但是修复不了是怎么回事? 苹果xr更新系统后微信打不开,闪退怎么解决? xr手机软件打不开闪退怎么回事 苹果xr王者荣耀闪退怎么解决 苹果xr更新14.3总是闪退 苹果XR又是系统点不开闪退是什么原因? 苹果为什么老是闪退 上海苹果维修:苹果xr闪退该怎么解决? 苹果xr闪退怎么修复 iphone xr手机太卡还闪退怎么办? 苹果xr手机出现闪退怎么办 java动态代理和cglib动态代理的区别 动态住宅IP和静态住宅IP有什么区别?怎么选择? jdk动态代理和cglib的区别 Spring的两种动态代理有什么区别 什么是aop AOP是什么意思? Spring事务管理是动态代理还是静态代理? CGLB支持动态代理吗?因为我听老师说CGLB是静态代理 Spring AOP实践动态代理和静态代理,为什么使用AOP spring的动态代理有几种实现方式 Spring AOP 一般用在什么场景中 小米9开启开发者选项在哪里 小米9的开发者选项在哪里打开 小米9手机开发者选项在哪 小米9开发者选项在哪里怎么打开 小米9se开发者选项在哪 小米的开发者选项怎么不见了,应该去哪里找? 小米9怎么进入开发者模式 小米9开发者选项在哪里关闭 小米cc9pro怎么进入开发者选项 小米9开发者选项怎么开启
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com