java 的动态代理机制

在java 的动态代理机制中,有两个重要的类或者接口,一个是InvocationHandler(interface),

另一个则是Proxy(Class).

这一个类和接口是实现我们动态代理所必须用到的。

InvocationHandler:

每一个动态代理类都必须要实现InvocationHandler 这个接口,并且每个代理类的实例都关联到了

一个handler, 当我们通过代理对象调用一个方法的时候,这个方法的调用

就会被转发为由InvocationHandler这个接口的invoke方法来进行调用。

Object invoke(Object proxy, Method method, Object[] args)throwsThrowable

proxy:指代我们所代理的那个真实对象

method:指代的是我们所要调用真实对象的某个方法的Method对象

args:指代的是调用真实对象某个方法时接受的参数

Proxy:

Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是newProxyInstance这个方法:

publicstaticObjectnewProxyInstance(ClassLoader loader, Class[] interfaces,  InvocationHandler h)throwsIllegalArgumentException

loader:一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载

interfaces:一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了

h:一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上

动态代理的主要作用:

主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情(甚至根本不去执行这个方法),因为在InvocationHandler的invoke方法中,你可以直接获取正在调用方法对应的Method对象,具体应用的话,比如可以添加调用日志,做事务控制等。

Spring 的app切面编程, struct 的拦截器都用到了动态代理的思想

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容