Java动态代理实例
2017-06-03 23:43
169 查看
静态代理:特征是代理类和目标对象的类都是在编译期间确定下来的,不利于程序的扩展。同时,每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。
最好可以通过一个代理类完成全部的代理功能。
动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。
代理设计模式的原理:
使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
最好可以通过一个代理类完成全部的代理功能。
动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。
代理设计模式的原理:
使用一个代理将对象包装起来,然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。
/** * 静态代理模式 */ //接口 interface ClothFactory { void productCloth(); } //被代理类 class NikeClothFactory implements ClothFactory{ public void productCloth() { System.out.println("Nike Factory!"); } } //代理类 class ProxyFactory implements ClothFactory{ ClothFactory cf; //创建代理类的对象时,实际传入一个被代理类的对象 public ProxyFactory(ClothFactory cf) { this.cf = cf; } public void productCloth() { System.out.println("代理类开始执行!"); cf.productCloth(); } } public class TestClothProduct { public static void main(String[] args) { NikeClothFactory nike = new NikeClothFactory(); //创建被代理类的对象 ProxyFactory proxy = new ProxyFactory(nike); //创建代理类的对象 proxy.productCloth(); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * 动态代理的使用 */ interface Subject { void action(); } //被代理类 class RealSubject implements Subject { public void action() { System.out.println("我是被代理类!"); } } // class MyInvocationHander implements InvocationHandler{ Object obj; // 实现了接口的被代理类的对象的声明 //1.给被代理的对象实例化;2.返回一个代理类的对象 public Object blind(Object obj) { this.obj = obj; return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); } //当通过代理类的对象发起对被重写的方法调用时,都会转换为对如下的invoke方法的调用 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //method方法的返回值是returnVal Object returnVal = method.invoke(obj, args); return returnVal; } } public class TestProxy { public static void main(String[] args) { //1.被代理类的对象 RealSubject real = new RealSubject(); //2.创建一个实现了InvocationHandler接口类的对象 MyInvocationHander hander = new MyInvocationHander(); //3.调用blind()方法,动态的返回一个同样实现了real所在类的实现的接口Subject的代理类的对象 Object obj = hander.blind(real); Subject sub = (Subject)obj; //此时的sub就是代理类的对象 sub.action(); //转到对InvocationHandler接口的实现类的invoke()的调用 //再举一个例子 NikeClothFactory nike = new NikeClothFactory(); ClothFactory proxyCloth = (ClothFactory) hander.blind(nike); // proxyCloth即为代理类的对象 proxyCloth.productCloth(); } }
相关文章推荐
- java动态代理简单实例
- java使用动态代理来实现AOP(日志记录)的实例代码
- java学习之路 之 反射机制综合练习题、动态代理实例
- java 中动态代理(JDK,cglib)实例代码
- Java动态代理简单实例:老板与秘书
- Java静态代理、动态代理实例
- java反射中的动态代理机制(有实例)
- Java代理(jdk静态代理、动态代理和cglib动态代理)实例及总结
- java实现动态代理代码实例(死循环溢出的问题的解决)
- java 使用动态代理 和ThreadLocal实现事务管理实例
- java jdk动态代理 实例 简单明了 对初学者非常有效
- Java反射和动态代理详解和实例
- java动态代理实例
- Java动态代理分析及简单实例
- Java静态代理、动态代理实例
- java动态代理简单实例。
- java动态代理简单实例
- java使用动态代理来实现AOP(日志记录)的实例代码
- Java反射和动态代理详解和实例
- JAVA动态代理实例