在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 的拦截器都用到了动态代理的思想