![](/img/trans.png)
[英]How to run multiple maven project using Maven Jetty Plug-in in eclipse
[英]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()
方法已運行。
插件有兩種方法:
matches
確定要檢測的類型。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.