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

本文详细介绍了JDK动态代理的工作原理及其实现过程。重点讲解了如何通过Proxy.newProxyInstance()生成代理类,并利用InvocationHandler接口中的invoke方法来实现对目标类方法的调用。

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() 参数分别是:

  1. this:$Proxy0 代理类
  2. m3:反射获取到的接口的方法(Method)
  3. 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中使用从代理类中传入的由反射获取到的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值