如何使用 MethodCall.invoke(someElementMatcher) 创建一个 MethodCall 来表示我随后在检测类型中定义的方法?

How do I use MethodCall.invoke(someElementMatcher) to create a MethodCall representing a method I subsequently define in an instrumented type?

我正在使用 ByteBuddy 生成 class。

在使用 DynamicType.Builder 之前,我打算将 MethodCall 存储为实例变量:

private final MethodCall frobCall =
  MethodCall.invoke(ElementMatchers.named("frob")); // here I invoke a method I'm going to define as part of the instrumented type

然后在我的检测类型的生成逻辑中,我定义了 frob 方法来做一些事情:

.defineMethod("frob")
.intercept(...etc....) // here I define frob to do something

…然后我定义(比方说)baz 方法来调用 frob:

.defineMethod("baz")
.withParameter(...) // etc.
.intercept(frobCall); // invokes "frob", which I've just defined above

(我试图保持简单,可能打错了一些东西,但我希望你能明白我正在尝试做的事情的要点。)

当我 make() 我的 DynamicType 时,我收到一个错误,指出动态类型没有定义 frob。这让我很困惑,因为我当然已经定义了它,正如你在上面看到的那样。

是否有一些我不知道的限制禁止 ElementMatchers 识别稍后定义的检测类型方法?我真的必须在这里使用 MethodDescription.Latent 吗?

它应该匹配检测类型的所有方法。如果这没有按预期发生,请在 MethodCall.MethodLocator.ForElementMatcher 中设置断点以查看该方法未显示的原因。我假设它是由您的方法匹配器过滤的。

不过我注意到它不包含私有方法,该方法现已修复并将在 Byte Buddy 1.10.18 中发布。