`

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

    博客分类:
  • Java
 
阅读更多
 
  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

 

分享到:
评论

相关推荐

    JDK的动态代理(powernode 文档)(源代码)

    JDK的动态代理(powernode 文档)(源代码) JDK的动态代理(powernode 文档) 一、动态代理 1.1JDK动态代理 1.1.1 proxy 1.1.2 InvocationHandler 1.1.3 创建一个Maven项目 1.1.4 导入Spring的相关依赖 1.1.5 修改...

    Java面向对象系列[v1.0.0][使用反射生成动态代理]

    在Java的java.lang.reflect包里有个Proxy类和一个InvocationHandler接口,通过使用他们可以生成JDK动态代理类或动态代理对象 使用Proxy和InvocationHandler创建动态代理 Proxy提供了用于创建动态代理类和代理对象的...

    AOP的实现机制

    使用动态代理实现AOP需要有四个角色:被代理的类,被代理类的接口,织入器,和InvocationHandler,而织入器使用接口反射机制生成一个代理类,然后在这个代理类中织入代码。被代理的类是AOP里所说的目标,...

    JDK动态代理(powernode CD2207 video)(教学视频+源代码)

    JDK动态代理(powernode CD2207 video)(教学视频+源代码) JDK动态代理(powernode CD2207 video) 一、动态代理 1.1JDK动态代理 1.1.1 proxy 1.1.2 InvocationHandler 1.1.3 创建一个Maven项目 1.1.4 导入Spring...

    类似spring Aop的Proxy封装

    有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop ...省去了去实现jdk的InvocationHandler,而且用户只关心对方法进行怎样的处理.

    spring动态代理原理

    通过代码了解springaop原理,代码采用jdk的动态代理相关类Proxy、InvocationHandler解释动态代理模式

    demo:java生产项目常用的demo

    使用jdk proxy代理接口方式实现 使用Cglib代理类方式实现 自己实现的动态代理 模仿jdk proxy自己实现动态代理: 核心:实现动态代理的Proxy类 , 实现动态代理的InvocationHandler类重写invoke方法实现. 二.spring 1...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

    java 实现AOP

     JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被...

    摩西设计

    JDKProxy,JDKInvocationHandler,是代理类的定义和实现,这部分也就是抽象⼯⼚的另外⼀种实现⽅式。通过这样的⽅式可以很好的把放置操作Redis的⽅法进⾏代理操作,通过控制不同的⼊参对象,控制缓存的使坯。 ...

    vs没报错leetcode报错-leetcode:leetcode

    动态代理(JDK代理,借口代理) package basicKnowledge.dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * JDK 动态代理 * */ ...

    Java 高级特性.doc

    这个是JDK 增加的新特性的用法! public static void loop(int x,int... args ) { //这里的参数一定要以这样的形式输入 for(int i:args) { System.out.println(i); } } 3.枚举 写枚举技巧: 1. enum Gender{...

Global site tag (gtag.js) - Google Analytics