JDK动态代理:
实现 InvocationHandler 的invoke(Object proxyObj, Method mothod, Object[] args);
$Proxy0:通过Proxy.newProxyInstance()生成的代理类,生成方法就是在仿照 原实现类 实现其接口,再生成一个新的类去实现接口。
$Proxy0代理类:
$Proxy0 extends Proxy implements 目标类接口

静态代码块:通过反射机制,获取到目标接口的方法 m3。

这里会在transform方法被调用时,通过InvocationHandle接口 h 也就是我们创建的InvocationHandle实现类(代理类)回调invoke(xxx)方法。
invocationHandlerImp.invoke(Object proxyObj, Method mothod, Object[] args)
这里的 invoke() 参数分别是:
- this:$Proxy0 代理类
- m3:反射获取到的接口的方法(Method)
- new Object[]{var1}:使用此方法时传入的参数 var1
这里用到了多态(接口.方法名(参数):h.invoke($Proxy, m3, args[]))

上边的super.h.invoke(),会调用如下 invoke(),因为InvocationHandle接口组合到 Proxy类中,故在创建代理类时传入的 InvocationHandle 对象会被赋值给Proxy的 InvocationHandle h ,而 h 运行时类型是 MessageHandle,因此会调用我们实现的invoke()方法。

总结:
通过Proxy获取目标类的代理类(实现同一个接口),接着通过多态的一种方式,使用InvocationHandle接口调用invoke()方法,在invoke中使用从代理类中传入的由反射获取到的方法。
本文详细介绍了JDK动态代理的工作原理及其实现过程。重点讲解了如何通过Proxy.newProxyInstance()生成代理类,并利用InvocationHandler接口中的invoke方法来实现对目标类方法的调用。
23万+

被折叠的 条评论
为什么被折叠?



