如何观察变量的变量

Dan*_*ush 7 java reflection variables

我想知道是否有任何方法可以在程序运行时观察变量值的变化.当然不使用调试器我想以编程方式进行.例如:

class A
{
   public static int valueToBeWatched;
}
Run Code Online (Sandbox Code Playgroud)

因此,在运行时,如果在我的项目中的任何类的任何方法中修改此值,MyValueChangeListner则应调用该事件.

Ano*_*sse 12

你不能.Java本身没有内置的watch-on-modification钩子.显然,你可以做民意调查.但那时它不会"活着".

AspectJ 可能允许这样的思考,但我不确定它是否适用于原始变量,或者仅当你使用getter和setter时.

干净的Java方法是创建变量private并使用getter和setter.

private valueToBeWatched;

public void setValue(int newval) {
  valueToBeWatched = newval;
  notifyWatchers();
}

public int getValue() {
  return valueToBeWatched;
}
Run Code Online (Sandbox Code Playgroud)

另外,请static尽可能避免.特别是public但不是final.


Pet*_*rey 8

您需要将类替换为int一个类,只要值发生更改,它就会调用您的侦听器.您可能希望在实际未更改时忽略设置值.

例如

 private int value;
 private final MyValueChangeListener listener;

 public void setValue(int value) {
    if(this.value == value) return;
    listener.changed(this, this.value, value);
    this.value = value;
 }
Run Code Online (Sandbox Code Playgroud)

您可以使用字节代码注入执行此替换,但更改原始代码非常简单.

另一种方法是监视值以定期查找更改.除非价值变化非常缓慢,否则您可能看不到每一个变化.您可以使用调试器API执行此操作,但这并不简单,除非您已熟悉API,否则我建议您不要使用它.

Java调试器API链接

http://java.sun.com/javase/technologies/core/toolsapis/jpda/

http://docs.oracle.com/javase/6/docs/technotes/guides/jpda/

http://docs.oracle.com/javase/6/docs/jdk/api/jpda/jdi/