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

动态监视java对象字段和方法返回值,java,reflection,monitoring,Java,Reflection,Monitoring,我正在尝试开发一个模拟应用程序。我需要监视仿真环境中的所有java对象。在模拟执行过程中,在每个记号中周期性地调用用户定义的对象方法。我想跟踪所有对象的所有字段值和方法返回值。比如说, public class Person{ int energy,x,y; public Person(){ this.energy = new Random().nextInt(0,10); } @ScheduledMethod(start=1, interval=1) void step(){

我正在尝试开发一个模拟应用程序。我需要监视仿真环境中的所有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);
} }
在我的模拟器中,跟踪并保存每个人在死亡前每个滴答声中的能量值。模拟开发人员通常使用随机化函数,因此两次调用一个方法可能不会返回与人的x、y值相同的值

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

我提到我需要一个监视机制,比如JAVA调试API。我需要观察所有字段和方法返回值,比如执行中的调试代码

任何想法


感谢您的想法

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

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

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

最后两个选项很难实现,因此我强烈建议首先考虑第一个选项。

感谢您的回答。第一个选择也是我的解决方案。但是我想让开发者们改变,观看所有的表达式,比如Java调试器。İ希望在执行过程中观察watch表达式,就像方法调用的结果一样,而不影响代码的执行行为。调试器工具是否在运行时处理字节码?向映射添加某种侦听器支持-覆盖
put()
,以通知侦听器所做的更改。然后在上面粘贴任何你想要的UI。