JDK动态代理

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. }  

转载于:https://www.cnblogs.com/Lhhh/p/8618096.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值