java动态代理DynamicProxy学习

来源:互联网 发布:云房数据这公司怎么样 编辑:程序博客网 时间:2024/05/22 10:50


          今天突然看到动态代理,想仔细研究一下,下面写一下心得,纯属个人见解,如有不对希望看到的大侠指正。

1、首先说一下什么是动态代理以及动态代理的作用和应用场景(总结一下网上看到的),动态代理其实就是在程序运行期对请求(如方法、消息)做一些特殊的处理(如事务管理、记录日志),增加了程序的灵活性,如AOP,其实请求拦截下来了我们可以做任何我们想做的事情。


2、动态代理的实现方式:第一种是接口实现,第二种是继承原来的类(cglib)我这里写的是用接口的实现方式

3、知识点涉及到一个接口InvocationHandler 一个类Proxy

    从java API中可以看到介绍大致为

 3.1  interface InvocationHandler 
   Object invoke(Object proxy, Method method, Object[] args) 
   在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。 
   参数:
proxy - 在其上调用方法的代理实例
method - 对应于在代理实例上调用的接口方法的 Method 实例。Method 对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
args - 包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。基本类型的参数被包装在适当基本
包装器类(如 java.lang.Integer 或 java.lang.Boolean)的实例中。 
返回:
从代理实例的方法调用返回的值。如果接口方法的声明返回类型是基本类型,则此方法返回的值一定是相应基本包装对象类的实例;否则,
它一定是可分配到声明返回类型的类型。如果此方法返回的值为 null 并且接口方法的返回类型是基本类型,
则代理实例上的方法调用将抛出 NullPointerException。否则,如果此方法返回的值与上述接口方法的声明返回类型不兼容,则代理实例上的方法调用将抛出 


3.2 class Proxy 
真正表示动态代理的类,提供两个静态方法:  
Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface) 
用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”, 
用来冒充真实的对象。 
Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 
产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类), 
它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法, 
invoke方法就是我们用来做N多事情的地方



本来想画个图说明一下,发现自己画的的真心不行,还是解释一下吧:这里发给原始对象方法的请求被拦截给代理对象(用Proxy new的那个方法生产),代理对象的收到请求后会执行关联对象中的invoke方法,而在invoke方法中我们可以执行原始对象的方法,大概就是这样,如果不明白,咱们看下面的代码。

 java代码 用户实体类




java代码 保存用户接口



java代码 接口实现类



java代码  生成与代理类相关联的InvocationHandler对象 



java代码 最后是测试类(用的JUnit)



输出结果:



新人学习,有不对的请多多指教!












原创粉丝点击