ByteBuddy 没有找到一些方法
ByteBuddy not finding some methods
我使用 ByteBuddy 示例 LogInterceptor
(仅打印被调用方法的名称)创建了以下代理,据推测它会变基每个 class 并转换每个方法:
public static void main(String[] args) {
ByteBuddyAgent.installOnOpenJDK();
new AgentBuilder.Default()
.rebase(ElementMatchers.any())
.transform((builder, typeDescription) -> builder
.method(ElementMatchers.any())
.intercept(
MethodDelegation
.to(LogInterceptor.class)
.andThen(SuperMethodCall.INSTANCE)
)
)
.installOnByteBuddyAgent();
完成此操作后,我继续调用我的代码,例如:
new JFXPanel()
...初始化 JavaFX。但是,我没有看到我的拦截器在 JavaFX 中打印任何方法。但更糟糕的是,我也没有看到 ByteBuddy 在我的一些 classes 上打印任何方法,尽管它在其中一些完全随机地打印(或者看起来如此)。
难道我的代理不应该为每个 class 捕获每个方法吗?这显然不是我想要做的,但作为调试为什么我感兴趣的方法没有被检测的一种方式。
LogInterceptor
及其方法的可见性似乎很重要,因此使 public 而不是像以前那样受保护的包可以使事情正常进行。然而,这并不能真正解释为什么我的一些方法被正确调用,但无论如何这是我的问题的答案。
Byte Buddy 确保仅在拦截的 class 可见的情况下才调用方法。由包私有 class 声明但没有 public 超级 class 的 public 方法例如对 class 永远不可见,因为声明 class 是调用签名的一部分。否则,这将导致在运行时出现 IllegalAccessException。
如果被拦截的 class 没有可见的拦截器方法,检测将失败。您可以向代理注册一个侦听器以了解此类情况。
注意:不过,你是对的,Byte Buddy 目前认为包私有类型的 public 方法是不可见的,即使它覆盖了另一个 public 类型的方法。这不直观,我将改变这种行为。
我使用 ByteBuddy 示例 LogInterceptor
(仅打印被调用方法的名称)创建了以下代理,据推测它会变基每个 class 并转换每个方法:
public static void main(String[] args) {
ByteBuddyAgent.installOnOpenJDK();
new AgentBuilder.Default()
.rebase(ElementMatchers.any())
.transform((builder, typeDescription) -> builder
.method(ElementMatchers.any())
.intercept(
MethodDelegation
.to(LogInterceptor.class)
.andThen(SuperMethodCall.INSTANCE)
)
)
.installOnByteBuddyAgent();
完成此操作后,我继续调用我的代码,例如:
new JFXPanel()
...初始化 JavaFX。但是,我没有看到我的拦截器在 JavaFX 中打印任何方法。但更糟糕的是,我也没有看到 ByteBuddy 在我的一些 classes 上打印任何方法,尽管它在其中一些完全随机地打印(或者看起来如此)。
难道我的代理不应该为每个 class 捕获每个方法吗?这显然不是我想要做的,但作为调试为什么我感兴趣的方法没有被检测的一种方式。
LogInterceptor
及其方法的可见性似乎很重要,因此使 public 而不是像以前那样受保护的包可以使事情正常进行。然而,这并不能真正解释为什么我的一些方法被正确调用,但无论如何这是我的问题的答案。
Byte Buddy 确保仅在拦截的 class 可见的情况下才调用方法。由包私有 class 声明但没有 public 超级 class 的 public 方法例如对 class 永远不可见,因为声明 class 是调用签名的一部分。否则,这将导致在运行时出现 IllegalAccessException。
如果被拦截的 class 没有可见的拦截器方法,检测将失败。您可以向代理注册一个侦听器以了解此类情况。
注意:不过,你是对的,Byte Buddy 目前认为包私有类型的 public 方法是不可见的,即使它覆盖了另一个 public 类型的方法。这不直观,我将改变这种行为。