JDI - 继承字段上的ObjectReference.setValue()

时间:2014-06-16 03:40:09

标签: java jdi

我正在使用JDI来调试程序。我试图更改某个ObjectReference中的字段的值。我有Field对象,因为我可以通过

找到它
ObjectReference.referencetype().allFields()

但是,我无法使用

修改该字段
ObjectReference.setValue(Field paramField, Value paramValue)

因为它仅适用于此类或其直接超类中的字段 - 不包括层次结构中的更高类。

是否可以更改高于直接超类的类中的字段值? 如果是这样,我将不胜感激任何帮助!

谢谢,

迪安

编辑:我在调用ObjectReference.setValue()的行中抛出以下错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at com.sun.tools.jdi.MirrorImpl.validateMirror(MirrorImpl.java:49)
at com.sun.tools.jdi.ObjectReferenceImpl.setValue(ObjectReferenceImpl.java:214)

2 个答案:

答案 0 :(得分:1)

ObjectReference.setValue(Field paramField, Value paramValue)

适用于所有字段,无论字段在层次结构中有多大。

示例:

public class AClass {

    private int a = 10;

    public void a() {
        System.out.println("a=" + a);
    }

}
public class BClass extends AClass{

    private int b = 20;

    public void b() {
        System.out.println("b=" + b);
    }

}
public class CClass extends BClass{

    public void checkValues() {
        a();
        b();
    }
}

这里是用于更改其超高级别A

中字段a的值的代码
StackFrame currentFrame = mEvent.thread().frame(0);

ObjectReference objectReference = currentFrame.thisObject();

List<Field> fields = objectReference.referenceType().allFields();
System.out.println(fields);

objectReference.setValue(fields.get(1), vm.mirrorOf(30));

这是输出以确认值的变化:

a=30
b=20

答案 1 :(得分:0)

使用org.apache.commons.beanutils.PropertyUtils你甚至可以得到/设置继承的字段:

PropertyUtils.getNestedProperty(obj, "property")