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动态代理

原文地址:https://www.cnblogs.com/xiaohan666/p/9225133.html