将来的你一定会感激现在拼命的自己
一步一步向上爬的蜗牛🐌

Java动态代理位于java.lang.reflect包下,一般主要涉及到以下两个类:

(1)Interface InvocationHandler

该接口中仅定义了一个方法:public Object invoke(Object obj, Method method, Object[] args),在使用时,第一个参数obj一般是指代理类,method是被代理的方法,args为该方法的参数数组。这个抽象方法在代理类中动态实现。

(2)Proxy

该类即为动态代理类,static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h),返回代理类的一个实例,返回后的代理类可以当作被代理类使用。

JDK动态代理的一般实现步骤如下:

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

(2)创建被代理的类以及接口

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

(4)通过代理调用方法

  1. public interface Moveable {  
  2.     void move();  
  3. }  
[java] view plain copy
 
  1. public class Car implements Moveable {  
  2.   
  3.     @Override  
  4.     public void move() {  
  5.         //实现开车  
  6.         try {  
  7.             Thread.sleep(new Random().nextInt(1000));  
  8.             System.out.println("汽车行驶中....");  
  9.         } catch (InterruptedException e) {  
  10.             e.printStackTrace();  
  11.         }  
  12.     }  
  13.   
  14. }  
[java] view plain copy
 
  1. public class TimeHandler implements InvocationHandler {  
  2.   
  3.     public TimeHandler(Object target) {  
  4.         super();  
  5.         this.target = target;  
  6.     }  
  7.   
  8.     private Object target;  
  9.       
  10.     /* 
  11.      * 参数: 
  12.      * proxy  被代理对象 
  13.      * method  被代理对象的方法 
  14.      * args 方法的参数 
  15.      *  
  16.      * 返回值: 
  17.      * Object  方法的返回值 
  18.      * */  
  19.     @Override  
  20.     public Object invoke(Object proxy, Method method, Object[] args)  
  21.             throws Throwable {  
  22.         long starttime = System.currentTimeMillis();  
  23.         System.out.println("汽车开始行驶....");  
  24.         method.invoke(target);  
  25.         long endtime = System.currentTimeMillis();  
  26.         System.out.println("汽车结束行驶....  汽车行驶时间:"   
  27.                 + (endtime - starttime) + "毫秒!");  
  28.         return null;  
  29.     }  
  30.   
  31. }  
[java] view plain copy
 
  1. public class Test {  
  2.   
  3.     /** 
  4.      * JDK动态代理测试类 
  5.      */  
  6.     public static void main(String[] args) {  
  7.         Car car = new Car();  
  8.         InvocationHandler h = new TimeHandler(car);  
  9.         Class<?> cls = car.getClass();  
  10.         /** 
  11.          * loader  类加载器 
  12.          * interfaces  实现接口 
  13.          * h InvocationHandler 
  14.          */  
  15.         Moveable m = (Moveable)Proxy.newProxyInstance(cls.getClassLoader(),  
  16.                                                 cls.getInterfaces(), h);  
  17.         m.move();  
  18.     }  
  19.   
  20. }  
posted on 2018-03-21 16:54  将来的你一定会感激现在拼命的自己  阅读(167)  评论(0)    收藏  举报