zoukankan      html  css  js  c++  java
  • 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动态代理

  • 相关阅读:
    morning
    周末,又见周末
    One Care, still Care
    Linux 下挂载硬盘的 方法
    Oracle 11g Alert log 文件位置的问题
    Oracle中 drop user 和 drop user cascade 的区别
    如何加快建 index 索引 的时间
    Oracle ADDM 自动诊断监视工具 介绍
    Vmware SERVER 简介
    Oracle Logminer 说明
  • 原文地址:https://www.cnblogs.com/xiaohan666/p/9225133.html
Copyright © 2011-2022 走看看