`

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动态代理与CGLIB代理去区别

    首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象,而InvocationHandler接口则定义了处理代理对象调用方法的逻辑。当调用代理对象的...

    JDK动态代理proxy

    下面是一个简单的JDK动态代理示例,我们创建一个计算服务接口`Calculator`,然后使用动态代理来实现该接口,并在代理对象中添加日志功能。 ```java // 目标接口 interface Calculator { int add(int a, int b); } ...

    jdk动态代理技术详解

    例如,可以使用动态代理来实现记忆功能、数据库连接池、事务控制、AOP 等。动态代理的优点在于可以在不修改原有代码的情况下,增加新的功能,从而提高软件的灵活性和扩展性。 结论 JDK 动态代理技术是 Java 语言...

    JDK动态代理_JDK动态代理

    3. **创建动态代理对象**:使用`Proxy.newProxyInstance`方法创建动态代理对象,传入ClassLoader、接口数组和上一步骤创建的InvocationHandler实例。 4. **调用代理对象的方法**:当调用代理对象的方法时,会自动...

    InvocationHandler, Proxy机制

    通过阅读《JDK的动态代理深入解析(Proxy,InvocationHandler)》和《深入理解Java Proxy机制》文档,你将能够更深入地了解这两个核心概念的内部工作原理,以及如何在实际项目中灵活应用它们。 总之,`...

    JDK和CGlib分别实现的动态代理源代码

    JDK和CGlib是两种常用的动态代理实现方式,它们各自有不同的特性和使用场景。 首先,我们来详细了解一下JDK动态代理。JDK动态代理基于接口实现,它要求被代理的对象必须实现至少一个接口。通过`java.lang.reflect....

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    jdk动态代理和CGlib动态代理

    动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。以下是一些关键概念: 1. **Proxy类**:这是JDK动态代理的核心类,它提供了`newProxyInstance()`静态方法,用于创建...

    关于jdk动态代理的源码剖析

    - **只能代理实现了接口的类**:这是JDK动态代理的一个限制,如果目标对象没有实现任何接口,则无法使用JDK动态代理。 - **性能开销**:虽然这种开销通常很小,但在高并发场景下可能会成为瓶颈。 通过上述分析,...

    Jdk动态代理和cglib动态代理原理

    JDK动态代理是Java内置的一种机制,依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。以下是JDK动态代理的基本工作原理: 1. **InvocationHandler接口**:这是处理代理对象方法调用...

    JDK动态代理和CGLIB代理

    JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,而InvocationHandler接口定义了处理代理对象的方法调用的逻辑。当通过Proxy创建...

    模拟JDK动态代理内部实现

    Java中的动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。`Proxy`类用于创建一个实现了特定接口的代理对象,而`InvocationHandler`接口定义了处理代理对象方法调用的逻辑...

    JDK动态代理简单示例

    在Java中,动态代理是通过java.lang.reflect包下的两个类实现的:Proxy和InvocationHandler。Proxy类用于创建代理对象,而InvocationHandler接口则定义了处理代理对象方法调用的逻辑。 1. **Proxy类**: - Proxy类...

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

    JDK动态代理和Cglib动态代理实例源码

    首先,JDK动态代理是Java内置的一种机制,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了处理代理对象方法调用的...

    java jdk 动态代理 演示demo

    Java JDK提供了`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口,它们是实现动态代理的关键组件。`Proxy`类用于创建代理对象,而`InvocationHandler`接口定义了一个方法,用于处理代理对象...

    CGLIB 和 JDK生成动态代理类的区别

    使用便利性上,JDK动态代理的API相对简洁,只需要实现InvocationHandler接口并调用Proxy.newProxyInstance()方法即可创建代理对象。而CGLIB的使用稍微复杂一些,需要通过Enhancer类配置回调函数和目标对象,然后调用...

    jdk与cglib动态代理与底层实现

    - **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...

    jdk动态代理 + 拦截器实现小例

    在这个“jdk动态代理 + 拦截器实现小例”中,我们将探讨如何利用Java的InvocationHandler接口和Proxy类来实现拦截器模式,以实现灵活的代码扩展和日志记录、性能监控等需求。 首先,让我们理解什么是动态代理。在...

    Spring Aop的底层实现技术 --- Jdk动态代理原理

    JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。 InvocationHandler 是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务...

Global site tag (gtag.js) - Google Analytics