簡體   English   中英

如何在 ByteBuddy 轉換期間增加方法?

[英]How to augment methods during ByteBuddy transformation?

語境

我正在使用 ByteBuddy 實現字節碼轉換,並且操作過程是一個多步驟過程。 因此,操縱必須能夠:

  1. 擴充原有的方法
  2. 完全創建新方法
  3. 擴充通過 2 引入的方法。

對於 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 方法使用運行時實例。

問題

簡而言之:如果它遵循后者,我看不到前者的轉換。 實際執行順序如下:

  1. 我的類型得到處理,並通過MethodDelegation.…
  2. 在隨后的步驟中,我找到了新引入的方法,並嘗試使用@OnMethodExit建議通過Advice.to(…)來增加實現生成。
  3. 生成的代碼具有步驟 1 的行為,但缺少步驟 2 的行為。

我假設我無效地結合了實現的兩個部分。 有任何想法嗎? 預感: 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.

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