• JDK动态代理实现步骤


    JDK动态代理步骤

    1.       创建一个实现InvocationHandler接口的类,它必须实现invoke()方法

    2.       创建被代理的类及接口

    3.       调用Proxy的静态方法,创建一个代理类

    4.       通过代理调用方法

    代码如下:

    1. //1. 抽象主题  
    2. public interface Moveable {  
    3.     void move()  throws Exception;  
    4. }  
    5. //2. 真实主题  
    6. public class Car implements Moveable {  
    7.     public void move() throws Exception {  
    8.         Thread.sleep(new Random().nextInt(1000));  
    9.         System.out.println("汽车行驶中…");  
    10.     }  
    11. }  
    12. //3.事务处理器  
    13. public class TimeHandler implements InvocationHandler {  
    14.     private Object target;  
    15.      
    16.     public TimeHandler(Object target) {  
    17.         super();  
    18.         this.target = target;  
    19.     }  
    20.    
    21.     /** 
    22.      * 参数: 
    23.      *proxy 被代理的对象 
    24.      *method 被代理对象的方法 
    25.      *args 方法的参数 
    26.      * 返回: 
    27.      *Object 方法返回值 
    28.      */  
    29.     public Object invoke(Object proxy, Method method, Object[] args)  
    30.             throws Throwable {  
    31.         long startTime = System.currentTimeMillis();  
    32.         System.out.println("汽车开始行驶…");  
    33.         method.invoke(target, args);  
    34.         long stopTime = System.currentTimeMillis();  
    35.         System.out.println("汽车结束行驶…汽车行驶时间:" + (stopTime - startTime) + "毫秒!");  
    36.         return null;  
    37.     }  
    38.    
    39. }  
    40. //测试类  
    41. public class Test {  
    42.     public static void main(String[] args) throws Exception{  
    43.         Car car = new Car();  
    44.         InvocationHandler h = new TimeHandler(car);  
    45.         Class<?> cls = car.getClass();  
    46.         /** 
    47.          *loader 类加载器 
    48.          *interfaces 实现接口 
    49.          *h InvocationHandler 
    50.          */  
    51.         Moveable m = (Moveable) Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(), h);  
    52.         m.move();  
    53.     }  

    代码解释:

    在测试代码中,Proxy.newProxyInstance()方法需要3个参数:类加载器(要进行代理的类)、被代理类实现的接口,事务处理器。所以先实例化Car,实例化InvocationHandler的子类TimeHandler,将各参数传入Proxy的静态方法newProxyInstance()即可获得Car的代理类,前面的静态代理,代理类是我们编写好的,而动态代理则不需要我们去编写代理类,是在程序中动态生成的。

    其中AOP的实现原理就是动态代理,只不过AOP实现基于两种动态代理,分别为CGlib动态代理和JDK动态代理,本文说的问JDK动态代理

  • 相关阅读:
    CDH6.3.1安装详细步骤(感写B站若泽大数据)
    windows远程ubuntu UI教程
    CentOS7搭建Tensorflow计算环境(cuda+cudnn+jupyterlab(Anaconda3)+pytorch+Tensorflow)
    中国计算机学会推荐国际学术会议和期刊目录-2019
    基于BA网络模型的二部图数据集生成
    GitHub文件的克隆与上传
    博客园中随笔,文章的区别
    Pycharm新建文件时头部模板的配置方法
    asyncio 和aiohttp
    随机UA
  • 原文地址:https://www.cnblogs.com/xiaohan666/p/9225133.html
Copyright © 2020-2023  润新知