4

バイトバディを持つフィールドの「カスタム」セッターメソッドを作成しようとしています。Buddy 独自のメカニズムにより、標準のセッター/ゲッター メソッドを非常に簡単に実装できますが、いくつかのロジックを追加してセッターを拡張する洗練された方法を探しています。

例を簡単にするために、メソッド setChanged(String) を持つクラス A があるとします。目標は、A のサブクラスを作成し、対応するアクセス メソッドを持つフィールドを追加することです。問題は、追加された各セッター メソッドから setChanged("fieldName") を呼び出したいということです。

public void setName(String name)
{
  setChanged("name");
  this.name = name;
}

「通常の」setter メソッドの場合、byte byddy の実装は次のようになります。

new ByteBuddy()
  .subclass(A.class)
  .name("B")
  .defineField("name", Integer.TYPE, Visibility.PUBLIC)
   // args is a ArrayList<Class<?>>
  .defineMethod(getSetterName(name), Void.TYPE, args, Visibility.PUBLIC) 
  .intercept( FieldAccessor.ofField(name) )

私が求めているバイトコードは次のようになります。

L0
 ALOAD 0       // Loads the this reference onto the operand stack
 ILOAD 1       // Loads the integer value of the local variable 1 (first method arg)
 PUTFIELD package/B.name : I // stores the value to the field
L1
 ALOAD 0
 LDC "name"
 INVOKEVIRTUAL package/A.setChanged (Ljava/lang/String;)V
 RETURN

私の質問は: このコンテキストで FieldAccessor を再利用する方法はありますか?

4

1 に答える 1