摘要:动态代理是包提供的方式,它必须借助一个接口才能产生代理对象,所以要预先定义接口。第步,建立代理对象和真实对象的关系。第个是把生成的动态代理对象下挂在哪些接口下,这个写法就是放在实现的接口下。
JDK动态代理是java.lang.reflect.*包提供的方式,它必须借助一个接口才能产生代理对象,所以要预先定义接口。1. 接口
public interface Hello { public void sayHello() ; }2. 实现接口
提供实现类HelloImpl来实现接口:
public class HelloImpl implements Hello { @Override public void sayHello() { System.out.println("Hello world!"); } }3. 动态代理绑定
public class JdkProxyExample implements InvocationHandler { private Object target = null; /** * 建立代理对象和真是对象的代理关系,并返回代理对象 * @param obj 真实对象 * @return 代理对象 */ public Object bind(Object obj) { this.target = obj; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 代理方法逻辑 * @param proxy 代理对象 * @param method 当前的调度方法 * @param args 方法参数 * @return 代理结果返回 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("进入代理逻辑对象"); System.out.println("在调度真实对象之前的服务"); Object obj = method.invoke(target, args); System.out.println("在调度真实对象之后的服务"); return obj; } }
在 JDK 动态代理中,要实现代理逻辑类必须去实现 java.lang.reflect.InvocationHandler接口,它里面定义了一个invoke方法,并提供接口数组用于下挂代理对象。要建立起代理对象和真实服务对象的关系,然后实现代理逻辑,所以一共分为两个步骤 。
第1步,建立代理对象和真实对象的关系。这里是使用了 bind 方法去完成的 ,方法里面首先用类的属性 target 保存了真实对象 , 然后通过如下代码建立并生成代理对象。
Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
其中newProxyInstance 方法包含 3 个参数。
第 1 个是类加载器,我们采用了 target 本身的类加载器 。
第 2 个是把生成的动态代理对象下挂在哪些接口下 ,这个写法就是放在 target 实现的接口下。 HelloWorldlmpl 对象的接口显然就是 HelloWorld,代理对象可以这样声明: Hello proxy = xxxx 。
第 3 个是定义实现方法逻辑的代理类, this 表示当前对象,它必须实现InvocationHandler 接口的 invoke 方法 ,它就是代理逻辑方法的现实方法。
第2步,实现代理逻辑方法。 invoke 方法可 以实现代理逻辑, invoke 方法的 3 个参数的含义如下所示。
proxy,代理对象,就是 bind 方法生成的对象。
method , 当前调度的方法。
args , 调度方法的参数。
4. 测试动态代理public void testJdkProxy() { JdkProxyExample jdk =new JdkProxyExample(); //绑定关系,因为挂在接口 Hello下,所以声明代理对象 Hello proxy Hello proxy= (Hello)jdk.bind(new HelloImpl()); //注意,此时Hello对象己经是一个代理对象,它会进入代理的逻辑方法 invoke 里 proxy.sayHelloWorld(); }
测试结果:
进入代理逻辑对象 在调度真实对象之前的服务 Hello world! 在调度真实对象之后的服务
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73581.html
摘要:要明白,动态代理类的存在意义是为了拦截方法并修改逻辑而动态代理的局限性之一就是只能拦截接口所声明的方法。因为动态代理类是继承自业务类,所以该类和方法不能声明成无法继承或重写。者最终都是生成了一个新的动态代理类对象。 动态代理 1、先谈静态代理 对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实...
摘要:动态代理的核心是接口和类。以上结果说明它生成的代理类为,说明是代理。测试前提实现接口测试类使用接口方式注入代理方式必须以接口方式注入测试配置为,运行结果如下实际校验逻辑。。。。 本文也同步发布至简书,地址:https://www.jianshu.com/p/f70... AOP设计模式通常运用在日志,校验等业务场景,本文将简单介绍基于Spring的AOP代理模式的运用。 1. 代理模...
摘要:与静态代理对比,动态代理是在动态生成代理类,由代理类完成对具体方法的封装,实现的功能。本文将分析中两种动态代理的实现方式,和,比较它们的异同。那如何动态编译呢你可以使用,这是一个封装了的库,帮助你方便地实现动态编译源代码。 发现Java面试很喜欢问Spring AOP怎么实现的之类的问题,所以写一篇文章来整理一下。关于AOP和代理模式的概念这里并不做赘述,而是直奔主题,即AOP的实现方...
摘要:值得一提的是由于采用动态创建子类的方式生成代理对象,所以不能对目标类中的方法进行代理。动态代理中生成的代理类是子类,调试的时候可以看到,打开源码可看到实现了和也就实现方法。 前面讲到了动态代理的底层原理,接下来我们来看一下aop的动态代理.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理,一种是基于CGLib的动态代理. ①JDK动态代理:使用JDK创建代理有一个限制...
阅读 2292·2023-04-26 00:28
阅读 3004·2019-08-30 15:55
阅读 2715·2019-08-30 12:47
阅读 1510·2019-08-29 11:04
阅读 3054·2019-08-28 18:14
阅读 917·2019-08-28 18:11
阅读 1633·2019-08-26 18:36
阅读 3353·2019-08-23 18:21