バイトバディを持つフィールドの「カスタム」セッターメソッドを作成しようとしています。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 を再利用する方法はありますか?