ByteBuddy拦截场景下被拦截方法内部调用另一被拦截方法的执行结果与流程问询
ByteBuddy拦截场景结果与执行顺序分析
最终运行结果
只要使用ByteBuddy主流的子类代理、类重定义拦截方案,Foo类的A、B两个方法都会被成功拦截,拦截器Bar的C方法会被触发两次,不会出现内部方法调用漏拦截的问题。
完整执行顺序
假设调用入口为外部代码触发Foo代理实例的A方法,执行顺序如下:
- 外部调用Foo代理实例的
A()方法,匹配到A方法的拦截规则,首次进入拦截器Bar的C()方法 - 执行
C()方法第一行的callable#call(),当前callable绑定的是A方法的原实现(父类Foo的A方法逻辑),开始执行原A方法代码 - 原A方法内部调用
B()方法,当前运行实例为ByteBuddy生成的代理对象,this调用触发多态匹配,命中B方法的拦截规则,第二次进入拦截器Bar的C()方法 - 执行本次
C()方法第一行的callable#call(),调用B方法的原实现,原B方法代码执行完成后返回当前C方法 - B方法对应的C方法剩余逻辑执行完成,返回原A方法的B调用位置
- 原A方法剩余代码执行完成,返回A方法对应的C方法
- A方法对应的C方法剩余逻辑执行完成,最终结果返回给外部调用方
注:如果使用ByteBuddy的特殊拦截配置(比如仅拦截非this发起的方法调用、绑定调用指向原生父类实例而非代理实例),才会出现B方法不被拦截的情况,该情况属于非常规配置场景。
内容的提问来源于stack exchange,提问作者WestFarmer
相关产品推荐
相关产品推荐

