如何记录/监控java字段赋值操作

时间:2013-10-30 08:15:27

标签: java dynamic-proxy jdi

如何记录/监控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 ...
  }
}

NOTE:我想在每个提交的分配行之前或之后进行检验;所以它不能指出哪一行应该是仪器

是否可以使用JAVA DEBUG INTERFACE?或者有没有办法达到它的INStrument或动态代理

2 个答案:

答案 0 :(得分:1)

你可以使用javassist来做到这一点。适用于字段,但不适用于数组。我在快速序列化结构模拟中做了类似的事情:

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();
                            }
                        }
                    });

https://code.google.com/p/fast-serialization/source/browse/trunk/src/main/java/de/ruedigermoeller/heapoff/structs/unsafeimpl/FSTStructFactory.java

答案 1 :(得分:0)

我认为AOP是你需要的。阅读例如这个 http://www.javacodegeeks.com/2012/06/simple-introduction-to-aop.html