簡體   English   中英

ByteBuddy找不到某些方法

[英]ByteBuddy not finding some methods

我已經創建了以下代理,該代理使用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在我的某些類上打印任何方法,盡管在某些類中它是完全隨機地(或看起來)。

我的代理人不是應該為每個類都捕獲每個方法嗎? 顯然,這不是我想要執行的操作,而是作為一種調試方式,為什么沒有檢測到我感興趣的方法。

LogInterceptor及其方法的可見性似乎很重要,因此使該公共而不是像以前那樣受程序包保護可以使工作正常。 但是,這並不能真正解釋為什么我的某些方法被正確調用的原因,但是無論如何這都是我的問題的答案。

Byte Buddy確保只有在可見的情況下才從攔截的類中調用方法。 例如,由程序包專用類聲明但沒有公共超類聲明的公共方法對於類永遠是不可見的,因為聲明類是調用簽名的一部分。 否則,這將在運行時導致IllegalAccessException。

如果被攔截的類看不到任何攔截器方法,則檢測將失敗。 您可以向代理注冊偵聽器,以了解此類情況。

注意:不過,您是對的,盡管Byte Buddy當前認為包私有類型的公共方法是不可見的,即使它覆蓋了另一個公共類型的方法也是如此。 那不是直觀的,我將改變這種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM