JDK动态代理 -- InvocationHandle以及invoke(xxx)调用时机解析

JDK动态代理:

实现 InvocationHandler 的invoke(Object proxyObj, Method mothod, Object[] args);

$Proxy0:通过Proxy.newProxyInstance()生成的代理类,生成方法就是在仿照 原实现类 实现其接口,再生成一个新的类去实现接口。

$Proxy0代理类:

$Proxy0 extends Proxy implements 目标类接口

JDK动态代理 -- InvocationHandle以及invoke(xxx)调用时机解析_第1张图片

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

JDK动态代理 -- InvocationHandle以及invoke(xxx)调用时机解析_第2张图片

这里会在transform方法被调用时,通过InvocationHandle接口 h 也就是我们创建的InvocationHandle实现类(代理类)回调invoke(xxx)方法。

invocationHandlerImp.invoke(Object proxyObj, Method mothod, Object[] args)

这里的 invoke() 参数分别是:

  1. this:$Proxy0 代理类
  2. m3:反射获取到的接口的方法(Method)
  3. new Object[]{var1}:使用此方法时传入的参数 var1

这里用到了多态(接口.方法名(参数):h.invoke($Proxy, m3, args[]))

 JDK动态代理 -- InvocationHandle以及invoke(xxx)调用时机解析_第3张图片

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

JDK动态代理 -- InvocationHandle以及invoke(xxx)调用时机解析_第4张图片

总结:

通过Proxy获取目标类的代理类(实现同一个接口),接着通过多态的一种方式,使用InvocationHandle接口调用invoke()方法,在invoke中使用从代理类中传入的由反射获取到的方法。

你可能感兴趣的:(java)