簡體   English   中英

使用ByteBuddy Maven插件時如何注冊MemberSubstitution?

[英]How to register MemberSubstitution when using ByteBuddy Maven plug-in?

我想使用MemberSubstitution來重寫對特定字段的訪問。 為此,我想使用 ByteBuddy Maven 插件實現一個Plugin以在編譯時應用此更改。 在這種情況下如何注冊替換?

更新以提供更多上下文:

這是我要修改的 class :

public class Foo {

    private final String FOO = "FOO!";
    private final String BAR = "BAR!";

    public String test() {
        return FOO;
    }
}

這是我的Plugin

public class HookInstallingPlugin implements Plugin {

    @Override
    public boolean matches(TypeDescription target) {
        return target.getName().equals("Foo");
    }

    @Override
    public Builder<?> apply(Builder<?> builder, TypeDescription typeDescription, ClassFileLocator classFileLocator) {
        Field f = null;
        try {
            f = Class.forName("com.example.foo.Foo").getDeclaredField("BAR");
        } catch (NoSuchFieldException | SecurityException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        builder = builder.visit(MemberSubstitution.strict()
                .field(ElementMatchers.named("FOO"))
                .onRead()
                .replaceWith(f)
                .on(named("test")));

        return builder;
    }

    @Override
    public void close() throws IOException {
    }

我希望test()返回“BAR”,但它實際上返回“FOO.”,這在使用 javap 檢查字節碼時得到了證實。 類型沒有改變,但我可以確定apply()方法已運行。

插件有兩種方法:

  1. matches確定要檢測的類型。
  2. apply儀器thos類型。 它提供了一個DynamicType.Builder來注冊您的更改。

MemberSubstitution是一個裝飾器,而不是方法的替代品。 因此它是通過DynamicType.Builder上的visit方法注冊的:

builder = builder.visit(MemberSubstitution.strict().field(...).onWrite().stub().on(...));

例如,這將刪除最后一個參數中提供的匹配器中所有方法中匹配字段的所有字段寫入。

暫無
暫無

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

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