• 十七、动态代理


    一、动态代理概述:

    代理:

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

    动态代理:

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

     

    二、应用举例

    静态代理应用

     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 }
    我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。 我要做一个自由又自律的人,靠势必实现的决心认真地活着。
  • 相关阅读:
    在Selenium自动化中查找损坏的链接
    WebDriverManager
    在TestNG中重试失败的测试
    算法:汉诺塔
    Java 多线程
    spring ioc原理(看完后大家可以自己写一个spring)
    Apache与Nginx的区别
    Apache与Nginx的区分比较
    Java 设计模式
    Java 理论与实践: 正确使用 Volatile 变量
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/15334911.html
Copyright © 2020-2023  润新知