繁体   English   中英

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

[英]Dynamically monitoring java object field and method return values

我正在尝试开发一个模拟应用程序。 我需要监视模拟环境中的所有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这样的监视机制。 我如何在执行仿真过程中做到这一点。我需要观察所有字段和方法返回值,例如执行中的调试代码。

任何想法。

谢谢你的想法

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

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

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

最后两个选项的实现并非易事,因此我强烈建议您首先考虑第一个选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM