如何使用 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 中发布。
我正在使用 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 中发布。