一般用过动态代理以后会有很多人产生这样的疑问:
1.handler是怎么监听到代理对象的方法调用的?
2.为什么产生代理对象的时候需要传入接口?直接传入一个实现类,让代理对象持有一个实现类的引用不就应该可以了?
以这两个问题为主线,来简单剖析一下动态代理的底层实现。
跟踪Proxy.newInstance()跟踪到最底层会看到,代理对象的创建过程如下:
总结一下就是,代理对象都是这个格式:
public class $Proxy1 extends Proxy implements 传入的接口{ }
OK,第二个问题首先得到答案:
传入接口是因为底层要通过JIN技术来创建一个实现类(被代理对象)的兄弟对象(代理对象)。
继续来看方法的调用过程:
将代理对象反编译查看其中任意一个接口中的方法:
可以看到其实调用方法的最终是调用handler的invoke方法。
handler是被Proxy对象持有:
Proxy是代理对象的父对象,所以最终还是交给创建代理对象时传入的handler来处理。