其他分享
首页 > 其他分享> > 十七、动态代理

十七、动态代理

作者:互联网

一、动态代理概述:

代理:

用一个代理将对象包装起来(代理类和被代理类实现了一套接口),然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理;代理对象决定是否以及何时将方法调用转到原始对象上。

 

动态代理:

需求: 最好可以通过一个代理类完成全部的代理功能;由此产生了动态代理;

 

二、应用举例

静态代理应用

 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