我正在尝试为具有字节伙伴的字段创建“自定义”设置方法。Buddy 自己的机制允许非常容易地实现标准的 setter/getter 方法,但是,我正在寻找一种优雅的方法来使用一些额外的逻辑来扩展 setter。
为了简化示例,假设我们有一个类 A,它有一个方法 setChanged(String)。目标是做一个A的子类,添加一个具有相应访问方法的字段。问题是,我想从每个添加的 setter 方法中调用 setChanged("fieldName") 。
public void setName(String name)
{
setChanged("name");
this.name = name;
}
对于“正常”的 setter 方法,字节 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 ?