十七、动态代理
作者:互联网
一、动态代理概述:
代理:
用一个代理将对象包装起来(代理类和被代理类实现了一套接口),然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理;代理对象决定是否以及何时将方法调用转到原始对象上。
动态代理:
需求: 最好可以通过一个代理类完成全部的代理功能;由此产生了动态代理;
二、应用举例
静态代理应用
1 //***************************静态代理 代理类 被代理类 接口************************* 2 //接口 3 interface ClothFactory { 4 void produceColth(); 5 } 6 7 //代理类 8 class ProxyClothFactory implements ClothFactory { 9 10 private ClothFactory factory;// 用被代理类的对象进行实例化 11 12 public ProxyClothFactory(ClothFactory factory) { 13 super(); 14 this.factory = factory; 15 } 16 17 @Override 18 public void produceColth() { 19 // TODO Auto-generated method stub 20 System.out.println("produceColth.....start"); 21 factory.produceColth(); 22 System.out.println("produceColth.....end"); 23 } 24 25 } 26 27 //被代理类 28 class NikeClassFactory implements ClothFactory { 29 30 @Override 31 public void produceColth() { 32 System.out.println("Nike 制造衣服"); 33 } 34 } 35 36 public class Day29Proxy04 { 37 38 /** 39 * 静态代理 举例 40 * 41 * 特点:代理类和被代理类在编译期间就确定下来了; 42 * 43 * @Description 44 * @author lixiuming 45 * @date 2021年9月25日下午3:56:09 46 * 47 */ 48 @Test 49 public void test1() { 50 NikeClassFactory nike = new NikeClassFactory(); 51 ProxyClothFactory proxyClothFactory = new ProxyClothFactory(nike); 52 proxyClothFactory.produceColth(); 53 } 54 55 }
动态代理应用:
1 //*************************动态代理 接口 被代理类 动态代理工厂******************** 2 interface Human { 3 String getBelief(); 4 5 void eat(String food); 6 } 7 8 //被代理类 9 class SuperMan implements Human { 10 11 @Override 12 public String getBelief() { 13 return "I believe I can fly"; 14 } 15 16 @Override 17 public void eat(String food) { 18 System.out.println("我喜欢吃" + food); 19 } 20 21 } 22 23 /** 24 * 动态代理工厂类 25 * 26 * 问题一、 如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象? 问题二、当通过代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法? 27 * 28 * @Description 29 * @author lixiuming 30 * @date 2021年9月25日下午4:01:03 31 * 32 */ 33 class ProxyFactory { 34 35 // 调用此方法,返回一个代理类的对象,解决了问题一 36 public static Object getProxyInstance(Object obj) {// obj为被代理类的对象 37 MyInvocationHandler handler = new MyInvocationHandler(); 38 handler.bind(obj); 39 return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), handler); 40 } 41 42 } 43 44 class MyInvocationHandler implements InvocationHandler { 45 46 private Object obj;// 需要被代理类的对象进行赋值 47 48 public void bind(Object obj) { 49 this.obj = obj; 50 } 51 52 // 当我们通过代理类的对象,调用方法a时,就会自动的调用如下方法:invoke() 53 // 将被代理类要执行的方法a的功能就声明在invoke()中 54 @Override 55 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 56 // method 代理调用的对象调用的方法,此方法也作为被代理类对象调用的方法 57 // obj 被代理类的对象 58 return method.invoke(obj, args); 59 } 60 61 } 62 63 public class Day29Proxy04 { 64 65 /** 66 * 动态代理举例 67 * 68 * @Description 69 * @author lixiuming 70 * @date 2021年9月25日下午4:01:03 71 * 72 */ 73 @Test 74 public void test2() { 75 SuperMan superMan = new SuperMan(); 76 // 代理类的对象 77 Human object = (Human) ProxyFactory.getProxyInstance(superMan); 78 79 // 当通过代理类对象调用方法时,会自动调用被代理类同名的方法; 80 object.eat("四川麻辣烫"); 81 82 NikeClassFactory nike = new NikeClassFactory(); 83 84 ClothFactory object1 = (ClothFactory) ProxyFactory.getProxyInstance(nike); 85 object1.produceColth(); 86 } 87 88 }
标签:十七,调用,obj,对象,void,代理,动态,public 来源: https://www.cnblogs.com/lixiuming521125/p/15334911.html