0

出于调试目的,我需要跟踪Class属性更改。

例如考虑以下类:

class Test {
    int myInt;
    String myString;
    ...

    public void setMyInt(int a) ...
    public void setMyString(String s) ...

    public printDebugLog();
}

void main() {
    Test t = new Test();
    t.setMyInt(5);
    t.setMyString("Hello");
    t.printDebugLog();
}

我想输出如下:

myInt => 5
myString => Hello

简单的解决方案是立即创建日志。即添加Log如下功能:

void Log(String s) {
    System.out.println(s);
}

然后对集合函数进行编码,如下所示:

void setMyString(String s) {
    myString = s;
    Log("myString => " + s);
}

这需要以各种方式编写所有设置的函数,我想知道是否有更好的解决方案。例如,创建一个SetValue接受两个变量并将第一个属性设置为第二个对象的值的函数可能更容易(如果可能)。或类似的东西。

任何的想法?

4

3 回答 3

2

为此,您应该使用执行日志记录的正交代码来包装您的类。

由于您的类没有实现接口,因此您不能使用动态代理,因此您必须使用使用字节码工程的解决方案之一。

我知道的最强大的解决方案是 AspectJ。但可能你甚至不需要它。您可以使用 Javassist 或 CGLIb - 允许创建包装类的代理的字节码工程库,因此您可以添加执行日志记录的代码。

于 2012-10-15T14:00:17.030 回答
1

您可以使用 AOP 拦截 setter 方法并在调用它们时记录下来。一个快速的谷歌应该给你一些例子。

于 2012-10-15T14:00:54.517 回答
-3

如果您通过 JPDA 进行调试,您可以 在您喜欢观看的字段上
创建一个断点。

于 2012-10-15T14:00:35.747 回答