java bytebuddy AgentBuilder$Transformer API更改导致的问题

bkhjykvo  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(176)

我正在使用bytebuddy在测试中插入方法调用。我遇到了这个问题:

  • 代理错误:java.lang.AbstractMethodError:接收器类nz.ac.wgtn.nullannoinference.agent.NullLoggerAgent$4没有定义或继承解析的方法抽象转换(Lnet/bytebuddy/dynamic/DynamicType$Builder;Lnet/字节伙伴/描述/类型/类型描述;语言/类加载器;Lnet/字节伙伴/实用程序/Java模块;Ljava/安全/保护域;)Lnet/字节伙伴/动态/动态类型$生成器;接口net.bytebuddy.agent.builder.代理构建器$Transformer.*

关键问题是ProtectionDomain类型的AgentBuilder$Transformer::transform的最后一个参数。在版本1.10.20中,这是abscent。我可以升级,但这并不能解决我的问题,因为我无法控制正在使用的bytebuddy的版本,因为我想检测的许多程序已经通过mockito具有bytebuddy依赖性,通常是稍微旧的版本。
也许阴影可以起作用。有什么建议吗?我总是可以为不同版本的bytebuddy编写多个版本的代理,但这似乎非常笨拙,而且是一场维护噩梦。

bnlyeluc

bnlyeluc1#

我想我已经弄明白了--实际上这相当容易,我太习惯于lambdas了,以至于我没有看到明显的东西。

new AgentBuilder.Default()
..
.transform(
   new AgentBuilder.Transformer() {
      public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule) {
         return builder.visit(NullChecks.MethodWithoutReturnValues.VISITOR);
      }
      public DynamicType.Builder<?> transform(DynamicType.Builder<?> builder, TypeDescription typeDescription, ClassLoader classLoader, JavaModule javaModule,ProtectionDomain pd) {
         return builder.visit(NullChecks.MethodWithoutReturnValues.VISITOR);
      }
   }
)

也就是说,只需重载transform以支持两个API版本。

相关问题