0

我正在尝试开发一个模拟应用程序。我需要监控模拟环境中的所有 java 对象。在模拟执行期间,用户定义的对象方法在每个滴答中定期调用。我想跟踪所有对象的所有字段值和方法返回值。例如,

public class Person{
int energy,x,y;
public Person(){
   this.energy = new Random().nextInt(0,10); 
}

@ScheduledMethod(start=1, interval=1)
void step(){
   energy--;
   // move random x,y
   move();
}

void move(){
   this.x= new Random().nextInt(1,50);
   this.y = new Random().nexInt(1,50);
} }

在我的模拟器中,每个人在每个滴答声中的能量值都被跟踪并保存,直到人死为止。模拟开发人员通常使用随机函数,因此两次调用方法可能不会返回与 Person 的 x,y 值相同的值。

通过使用反射 API,我可以动态访问字段值(可以访问人的能量值。)但我需要访问方法返回值(人的 x,y 值在每次移动调用中都会更改)。当我使用反射调用方法时,该方法的执行会加倍。所以,我需要以不同的方式处理方法调用。

我提到我需要一个像 JAVA Debugging API 这样的监控机制。在模拟执行期间我如何做到这一点。我需要观察所有字段和方法返回值,例如在执行中调试代码。

任何想法。

感谢您的想法

4

1 回答 1

0

如果我理解您的要求正确,您希望在使用注释调用方法后捕获原始字段值的变化。

对此有很多可能的解决方案,具体取决于客户端代码需要多么简单,您要编写的框架有多复杂,以及您实际需要它做什么。这里有一些想法:

  • 有一个用于模拟对象的通用基类,并为子类提供一种将值存储在Map<String,Object>你给它们的方法,而不是在原始字段中;他们提供了一个Map记录更改的子类,并且您的代码可以简单地询问对象自上次调用以来发生了什么变化
  • 在加载字节码时即时检测字节码,使用类似BCEL的方法,并用调用动态生成的 getter 和 setter 替换本地字段访问,并在那里进行上述簿记
  • 执行上述操作,但在编译时通过动态生成包含簿记代码的子类

最后两个选项实施起来并不简单,所以我强烈建议首先考虑第一个选项。

于 2013-07-12T00:27:09.943 回答