0

我创建了以下代理,它应该使用 ByteBuddy 示例LogInterceptor(仅打印被调用方法的名称)重新定义每个类并转换每个方法:

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 在我的一些类上打印任何方法,尽管它在其中一些类中是完全随机的(或者看起来如此)。

我的代理不应该为每个类捕获每个方法吗?这显然不是我想要做的,而是作为一种调试方式,为什么我感兴趣的方法没有被检测。

4

2 回答 2

0

Byte Buddy 确保只有在拦截类可见的情况下才从拦截的类中调用方法。例如,由包私有类声明但没有公共超类声明的公共方法对类永远不可见,因为声明类是调用签名的一部分。否则,这将在运行时导致 IllegalAccessException。

如果没有拦截器方法对被拦截的类可见,则检测失败。您可以向代理注册一个侦听器以了解此类情况。

注意:您是对的,但是,Byte Buddy 当前认为包私有类型的公共方法是不可见的,即使它覆盖了另一种公共类型的方法。这不直观,我将改变这种行为。

于 2015-08-24T19:54:54.400 回答
0

似乎 theLogInterceptor及其方法的可见性很重要,因此将其公开而不是像以前那样受保护的包可以使事情正常进行。但是,这并不能真正解释为什么我的某些方法被正确调用,但这无论如何都是我的问题的答案。

于 2015-08-24T12:34:03.420 回答