我正在使用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)发布于 2015-07-22 19:01:33
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发布于 2014-06-16 20:12:26
使用org.apache.commons.beanutils.PropertyUtils,你甚至可以像这样获取/设置继承的字段:
PropertyUtils.getNestedProperty(obj, "property")https://stackoverflow.com/questions/24236361
复制相似问题