首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承字段上的JDI - ObjectReference.setValue()

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

Stack Overflow用户
提问于 2014-06-16 11:40:09
回答 2查看 344关注 0票数 0

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

代码语言:javascript
复制
ObjectReference.referencetype().allFields()

但是,我无法使用以下命令修改该字段

代码语言:javascript
复制
ObjectReference.setValue(Field paramField, Value paramValue)

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

是否可以在高于直接超类的类中更改字段的值?如果是这样的话,我将非常感谢大家的帮助!

谢谢,

院长

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

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

发布于 2015-07-22 19:01:33

代码语言:javascript
复制
ObjectReference.setValue(Field paramField, Value paramValue)

适用于所有字段,无论该字段在层次结构中处于多高的位置。

示例:

代码语言:javascript
复制
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的值的代码

代码语言:javascript
复制
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));

以下是用于确认值更改的输出:

代码语言:javascript
复制
a=30
b=20
票数 2
EN

Stack Overflow用户

发布于 2014-06-16 20:12:26

使用org.apache.commons.beanutils.PropertyUtils,你甚至可以像这样获取/设置继承的字段:

代码语言:javascript
复制
PropertyUtils.getNestedProperty(obj, "property")
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24236361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档