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 类型的方法。这不直观,我将改变这种行为。