欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDK使用InvocationHandler和Proxy实现动态代理

程序员文章站 2022-06-08 14:36:43
...
 
  1. --------------------------------------------------实现InvocationHandler接口------------------------------------  
[java] view plaincopy
  1. package interceptor;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.util.Date;  
  6.   
  7. public class LogInterceptor implements InvocationHandler{  
  8.   
  9.  //被代理对象  
  10.  private Object target;  
  11.    
  12.  //织入的代码  
  13.  private void beforMethod(Method method)  
  14.  {  
  15.   System.out.println(method.getName()+" start "new Date());  
  16.  }  
  17.    
  18.  @Override  
  19.  public Object invoke(Object proxy, Method method, Object[] args)  
  20.    throws Throwable {  
  21.   //先执行织入的代码  
  22.   beforMethod(method);  
  23.   //再执行被代理类里的方法  
  24.   method.invoke(target, args);  
  25.   return null;  
  26.  }  
  27.   
  28.  //-------------getter setter-----------------------------------  
  29.  public Object getTarget() {  
  30.   return target;  
  31.  }  
  32.   
  33.  public void setTarget(Object target) {  
  34.   this.target = target;  
  35.  }  
  36. }  


-----------------------------------------------------------dao--------------------------------------------------------------------------------

 

[java] view plaincopy
  1. package dao.impl;  
  2.   
  3. import dao.UserDao;  
  4. import domain.User;  
  5.   
  6. public class UserDaoImpl implements UserDao {  
  7.   
  8.  @Override  
  9.  public void save(User user) {  
  10.   System.out.println("start dao save");  
  11.  }  
  12.   
  13. }  


 

---------------------------------------------------------test-----------------------------------------------------------------------------

[java] view plaincopy
  1. package test;  
  2.   
  3. import java.lang.reflect.Proxy;  
  4.   
  5. import interceptor.LogInterceptor;  
  6. import dao.UserDao;  
  7. import dao.impl.UserDaoImpl;  
  8. import domain.User;  
  9.   
  10. public class ProxyTest {  
  11.   
  12.  public static void main(String[] args) {  
  13.   //被代理对象  
  14.   UserDao userDao = new UserDaoImpl();  
  15.   //织入代码的类  
  16.   LogInterceptor li = new LogInterceptor();  
  17.   li.setTarget(userDao);  
  18.   //得到代理对象..注意这里的第一个参数 要和userDao是同一个类加载器  
  19.   //第二个参数是实现哪个接口,要和被代理实现同样的接口  
  20.   //第三个参数是织入的类,该类实现了InvocationHandle接口  
  21.   UserDao userDaoProxy = (UserDao)Proxy.newProxyInstance(userDao.getClass().getClassLoader(),  
  22.     new Class[]{UserDao.class}, li);  
  23.   userDaoProxy.save(new User());  
  24.     
  25.   //代理类的名字  
  26.   System.out.println(userDaoProxy.getClass().getName());  
  27.     
  28.   //其实主要实现是这样的  
  29.   /** 
  30.    * public class $proxy0 implements UserDao 
  31.    * { 
  32.    *    public void save(User user) 
  33.    *    { 
  34.    *   //先得到要执行方法 
  35.    *   Method m = getMethod(); 
  36.    *   //然后把自身传给 InvocationHandler的invoke方法 
  37.    *   invoke(this,m,user);//public Object invoke(Object proxy, Method method, Object[] args) 
  38.    *    } 
  39.    * } 
  40.    */  
  41.     
  42.  }  
  43. }  


 

-----------------------------------------------------------------------------运行结果-------------------------------------

save start Sat Sep 10 21:39:13 CST 2011
start dao save
$Proxy0