手撕JAVA(三十四)动态代理底层实现

一般用过动态代理以后会有很多人产生这样的疑问:

1.handler是怎么监听到代理对象的方法调用的?

2.为什么产生代理对象的时候需要传入接口?直接传入一个实现类,让代理对象持有一个实现类的引用不就应该可以了?

以这两个问题为主线,来简单剖析一下动态代理的底层实现。

跟踪Proxy.newInstance()跟踪到最底层会看到,代理对象的创建过程如下:

手撕JAVA(三十四)动态代理底层实现

 

总结一下就是,代理对象都是这个格式:

public class $Proxy1 extends Proxy implements 传入的接口{ } 

OK,第二个问题首先得到答案:

传入接口是因为底层要通过JIN技术来创建一个实现类(被代理对象)的兄弟对象(代理对象)。

继续来看方法的调用过程:

手撕JAVA(三十四)动态代理底层实现

将代理对象反编译查看其中任意一个接口中的方法:

可以看到其实调用方法的最终是调用handler的invoke方法。
手撕JAVA(三十四)动态代理底层实现

handler是被Proxy对象持有:

Proxy是代理对象的父对象,所以最终还是交给创建代理对象时传入的handler来处理。

手撕JAVA(三十四)动态代理底层实现