动态代理详解

363 阅读1分钟

为啥一调用方法 invoke就得到执行?

2d44f666cd0071139ca65f8d20d7966.jpg

今天群友提问,为啥一调用方法 invoke就得到执行?

这问题看起来很简单,刚想回答,发现我确实不知道,这问题很犀利。

前情提要

要搞清楚这个问题,得先了解什么是动态代理,及其原理。
参考我之前的文章:动态代理,及其原理
参考大神文章:www.cnblogs.com/liuyun1995/…

开始

61b25cae83f62b5ac78274170972f76.png

e630d4a419c62d3ec6fd20e65f4064e.png

e60a808273fcfdffa13c448f7e32a28.png

反射出真的代理类 为啥传了一个参数呢???传的是h 也就是那个代理类的构造函数是有参数的 参数就是h

56f2db405d375bf81e45e1d269e5be2.png

而这个h就是传入的处理器

f419198cee1117439eb65c9cf0212de.png

也就是他 问题的那个 为啥这里会执行的处理器

所以 结论就是

7a2c3cda822a62e4b051b06fac3bec5.png

224fcb51b884a9221205aa2efff1629.png

2dc975492a871d3e0f6d89ede949b66.png

深入

那么 为啥会这么走呢?会走Proxy的invoke???

f2b6bea169ad636186a2b826c7dd7d7.png

225ff1145b3791c2e221bcb7e98f9e0.png

代理类是通过ProxyClassFactory这个工厂创建的

b93274d6bbae0e7e4c4cc7ca0563afc.png

image.png

61e548cb299e0ab0df37440af97d442.png

a35a0e7e8c8099ad14ce636d78e2bc2.png

这个工厂的创建代理类的方法 会走到ProxyGenerator.java的generateProxyClass()方法,这个方法,是通过generateClassFile这个来创建代理类的

image.png

generateClassFile

aa87281d7b013443be578e6591f396e.png

435975680928824b4bc6a8d1d29a337.png

c5807c71d31dbaa434e3ad84aa030e8.png

简单说就是
1.收集所有要生成的代理方法,将其包装成ProxyMethod对象并注册到Map集合中。
2.将这些方法 赋值,设置代理invoke
3.生成代理类

重点是第二步 --- 将这些方法 赋值,设置代理invoke

4ecdc319a6b0ebac0c641babfe74935.png

在第二步的第一步上 generateConstructor() 他将InvocationHandler当成构造函数的参数生成了 所以代理类里就有这个

image.png

第二步的第二步上,设置方法里的内容时,他将invoke设置进去了

5dc19ac5b32417f0e935f452d13c48f.png

image.png
...
97ff03a45a8cf1efac50c91ae5dfa05.png

效果就是

b17ca3eba76cd2d1aedbbd479ed741e.png

你调hashCode就是调用InvocationHandler的invoke

他这是用字节码的io的方式 生成代理方法,代理类的 ,完事了 去吃饭了。