一、动态代理概述:
代理:
用一个代理将对象包装起来(代理类和被代理类实现了一套接口),然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理;代理对象决定是否以及何时将方法调用转到原始对象上。
动态代理:
需求: 最好可以通过一个代理类完成全部的代理功能;由此产生了动态代理;
二、应用举例
静态代理应用
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
我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。