摘要:通过这种动态代理,可以实现在调用某些方法前实现我们想要的操作。
创建接口
// 创建一个接口,名字叫Resource public interface Resource { public void operationA(); public void operationB(); }实现接口
// Resource接口的实现 public class ConcreateResource implements Resource{ public ConcreateResource() { System.out.println("创建了一个ConcreateResource的对象"); } @Override public void operationA() { System.out.println("Operaation A"); } @Override public void operationB() { System.out.println("Operation B"); } }实现代理
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Resource resource; public DynamicProxy() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在方法调用时创建对象 if(resource==null){ resource = new ConcreateResource(); System.out.println("初始化"); } if (method.getName().equals("operationA")) { System.out.println("OperationA in Proxy"); } return method.invoke(resource, args);//执行方法; } //创建一个绑定了该代理对象的虚拟的Resource,此时并未创建实际的对象 public Resource create() { Resource resource = null; resource = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), new Class[] { Resource.class }, this);//绑定 return resource; } }测试
package test0107; import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) { //第一种测试,使用Create方法创建resource对象,在调用时创建该对象的实例 DynamicProxy dynamicProxy = new DynamicProxy(); Resource resource = dynamicProxy.create();//绑定,此时对象没有创建 System.out.println("此时对象未创建"); resource.operationA(); resource.operationB(); Resource resource2 = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(),new Class[]{Resource.class}, dynamicProxy); //在测试类中绑定 resource2.operationA(); resource2.operationB(); } } /* 结果如下: 此时对象未创建 创建了一个ConcreateResource的对象 初始化 OperationA in Proxy Operaation A Operation B OperationA in Proxy Operaation A Operation B */分析:
先输出“此时对象未创建”说明在使用代理绑定Resource对象的时候并没有创建该对象的实例,只是返回了一个可以调用的接口
输出“创建了一个ConcreateResource的对象”和“初始化”说明在调用方法的时候创建了该对象的实例
接下来的输出即说明绑定了代理的对象在每一次调用方法的时候都是在执行绑定的代理实例的invoke方法,如此,代理模式就完成了。
通过这种动态代理,可以实现在调用某些方法前实现我们想要的操作。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/65385.html
摘要:要明白,动态代理类的存在意义是为了拦截方法并修改逻辑而动态代理的局限性之一就是只能拦截接口所声明的方法。因为动态代理类是继承自业务类,所以该类和方法不能声明成无法继承或重写。者最终都是生成了一个新的动态代理类对象。 动态代理 1、先谈静态代理 对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实...
摘要:代理模式代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。 代理模式: 代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。应用场景一般是需要在执行某个已经写好的方法前后再添加一段逻辑,比如执行方法前打印日志,或者在执行方法之前和之后打时...
摘要:代理模式从类型上来说,可以分为静态代理和动态代理两种类型。然而今天的重点是我们都知道牛逼轰轰的的实现的一种方式是使用的动态代理另一种是,大部分人也会用的动态代理,不过没有研究过的动态代理到底是怎么实现的。 动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位。代理模式从类型上来说,可以分为静态代理和动态代...
Java的三种代理模式 参考:http://www.cnblogs.com/cenyu/...Java核心技术原书第九版6.5节 为什么使用代理 我们在写一个功能函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带来以下麻烦: 枝节性代码游离在功能性代码之外,它不是函数的目的,这是对OO是一种破坏 枝节性...
摘要:话说谁还干类似的事,就在文章末尾点个赞代销店等其实就是现在的商店,以前小的时候听家乡人叫代销店,也是一种代理模式。可以说是系统中最重要的架构之一。 showImg(https://segmentfault.com/img/remote/1460000012278678?w=1240&h=469); PS:转载请注明出处作者: TigerChain地址: http://www.jians...
阅读 1181·2021-10-18 13:32
阅读 2218·2021-09-24 09:47
阅读 1252·2021-09-23 11:22
阅读 2383·2019-08-30 14:06
阅读 506·2019-08-30 12:48
阅读 1935·2019-08-30 11:03
阅读 457·2019-08-29 17:09
阅读 2368·2019-08-29 14:10