JDK动态代理

来源:互联网 发布:linux查端口命令 编辑:程序博客网 时间:2024/05/24 00:41
  1. --------------------------------------------------实现InvocationHandler接口------------------------------------  
[java] view plaincopyprint?
  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 plaincopyprint?
  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 plaincopyprint?
  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