我正在使用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)
答案 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")