[英]How to augment methods during ByteBuddy transformation?
我正在使用 ByteBuddy 實現字節碼轉換,並且操作過程是一個多步驟過程。 因此,操縱必須能夠:
對於 1. 我使用了通過以下方式應用的@OnMethodExit
建議:
Builder<?> builder = builder.visit(Advice.to(Helper.class)
.on(ElementMatchers.hasMethodNamed(name));
使用Helper
方法的擴充代碼(有效地設置字段的值)。 創建新方法時,我按如下方式構建它們:
Builder<?> builder = builder.defineMethod(…)
.intercept(MethodDelegation.to(OtherHelper.class));
.…;
OtherHelper
通過將@This Object object
作為參數的 static 方法使用運行時實例。
簡而言之:如果它遵循后者,我看不到前者的轉換。 實際執行順序如下:
MethodDelegation.…
@OnMethodExit
建議通過Advice.to(…)
來增加實現生成。 我假設我無效地結合了實現的兩個部分。 有任何想法嗎? 預感: ElementMatcher
通過名稱匹配擴充是否看不到使用….defineMethod(…)
引入的方法? 該name
來自我從builder.toTypeDescription()
開始的一些方法檢查,這實際上使我假設要創建的方法已經對構建器可見,否則首先在該步驟中找不到它.
你能分享你的例子的重建嗎? 在一個簡單的例子中,我觀察到預期的行為:
public class Bar {
public static void main(String[] args) throws Exception {
Class<?> type = new ByteBuddy().subclass(Object.class)
.visit(Advice.to(Bar.class).on(named("m")))
.defineMethod("m", void.class, Visibility.PUBLIC)
.intercept(MethodDelegation.to(Bar.class))
.make()
.load(Bar.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
.getLoaded();
type.getMethod("m").invoke(type.getConstructor().newInstance());
}
@BindingPriority(2)
public static void delegation() {
System.out.println("Delegation!");
}
@Advice.OnMethodEnter
public static void enter() {
System.out.println("Advice!");
}
}
這個例子打印了兩個Advice! 和代表團! .
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.