引用ByteBuddy AgentBuilder中动态添加的方法

Referring to a dynamically added method in ByteBuddy AgentBuilder

我想使用字节好友实现以下场景

  1. 在抽象中定义一个新的构造函数class
  2. 在调用 #1 的子类型中创建一个新方法 然而,我运行遇到一个问题,即#2 的转换器无法找到#1 中定义的方法。

更详细的设置说明如下:

我有 classes BaseA

public abstract class Base {
  protected Base() {}
  protected Base(String s, Object o) {...}
}
public abstract class A {
  protected A() {}
}

我想给 A 添加另一个构造函数,等同于

  protected A(String s, Integer i) {
    super(s, i);
  }

所以我写了

new AgentBuilder.Default().type(named("A"))
  .transform((builder, typeDescription, classLoader, module) ->

    builder.defineConstructor(Visibility.PROTECTED)
        .withParameter(String.class)
        .withParameter(Integer.class)
        .intercept(
            MethodCall.invoke(isConstructor().and(takesArguments(String.class, Object.class)))
              .withArgument(0, 1)))
  .installOn(instrumentation);

如果我 运行 我的代码使用此代理,我能够看到在 运行 时添加的新构造函数。

现在我想在另一个 class B.

中引用这个新添加的构造函数
public class B extends A {

   // I want to add this method
   newMethod() {
     super("str", 0)
   }
}

所以我写了

new AgentBuilder.Default().type(isSubTypeOf(A.class)))
  .transform((builder, typeDescription, classLoader, module) ->

    builder.defineMethod("newMethod", typeDescription, Visibility.PUBLIC)
      .intercept(
          MethodCall.invoke(isConstructor().and(takesArguments(String.class, Integer.class)))
            .with("str")
            .with(0)))
  .installOn(instrumentation);

但是,我收到如下错误

java.lang.IllegalStateException: class B does not define exactly one virtual method or constructor for (isConstructor() and hasParameter(hasTypes(erasures(containing(is(class String), is(class Integer)))))) but contained 0 candidates: []

我可以不引用我在以前的转换器中添加的方法吗? (首次使用 ByteBuddy 用户)

问题是另一个 class 需要从 class 路径定位,其中存储的 class 文件以旧格式表示。与其使用隐式浏览层次结构的匹配器,不如显式提供方法,例如使用 MethodDescription.Latent.