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
.
您需要将类替换为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/
归档时间: |
|
查看次数: |
15298 次 |
最近记录: |