动态监视java对象字段和方法返回值

时间:2013-07-11 20:05:09

标签: java reflection monitoring

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

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值都会改变)。当我使用反射执行方法调用方法时,会使用twiced。所以,我需要以不同的方式处理方法调用。

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

任何想法。

感谢您的想法

1 个答案:

答案 0 :(得分:0)

如果我理解了您正确询问的内容,您希望在使用注释调用方法后捕获原始字段值的更改。

有很多可能的解决方案,具体取决于客户端代码的简单程度,以及您想要编写的框架的复杂程度,以及您实际需要执行的操作。以下是一些想法:

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

最后两个选项实现起来并不重要,所以我强烈建议先考虑第一个选项。