如何记录/监视java字段分配操作

如何记录/监视java字段分配操作,java,dynamic-proxy,jdi,Java,Dynamic Proxy,Jdi,如何记录/监控java字段分配操作; 例如,我想在赋值操作之前或之后添加一些函数 原始代码: class Test{ public String name; public void operation{ .... some code ... name="stackoverflow"; .... some code ... } } 更改代码后: class Test{ public String name; pub

如何记录/监控java字段分配操作; 例如,我想在赋值操作之前或之后添加一些函数

原始代码:

class Test{
 public String name;

 public void operation{
             .... some code ...
         name="stackoverflow";
            .... some code ...
  }
}
更改代码后:

class Test{
 public String name;
 public void operation{
          .... some code ...
      [[ my instrument code ]] 
         name="stackoverflow";
      [[ my instrument code ]]
           .... some code ...
  }
}
注意:
我想在每个字段赋值行之前或之后插入指令;因此,它不能手动指出哪条线应该是仪器


可以使用JAVA吗 调试接口??或者有什么方法可以达到它的目的吗?工具或动态代理我认为AOP是您所需要的。读一下这个例子

您可以使用javassist实现这一点。适用于字段,但不适用于数组。我在fast serialization struct模拟中做过类似的事情:

method.instrument( new ExprEditor() {
                        @Override
                        public void edit(FieldAccess f) throws CannotCompileException {
                            try {
                                if ( ! f.isStatic() ) {
                                    CtClass type = null;
                                    type = f.getField().getType();
                                    FSTClazzInfo.FSTFieldInfo fieldInfo = clInfo.getFieldInfo(f.getFieldName(), null);
                                    if ( fieldInfo == null ) {
                                        return;
                                    }
                                    if ( f.isReader() ) {
                                        structGen.defineStructReadAccess(f, type, fieldInfo);
                                    } else if ( f.isWriter() ) {
                                        structGen.defineStructWriteAccess(f, type, fieldInfo);
                                    }
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });