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

问题描述

我正在使用 ByteBuddy 生成一个类。

在使用 之前DynamicType.Builder,我打算将 a 存储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吗?

标签: byte-buddy

解决方案


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

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


推荐阅读