0

JDI を使用してプログラムをデバッグしています。特定の ObjectReference のフィールドの値を変更しようとしています。私はそれを見つけることができるように、フィールドオブジェクトを持っています

ObjectReference.referencetype().allFields()

ただし、使用してそのフィールドを変更することはできません

ObjectReference.setValue(Field paramField, Value paramValue)

これは、このクラスまたはその直接のスーパークラス内のフィールドでのみ機能するため、階層の上位クラスは含まれません。

直接のスーパー クラスより上位のクラスで Field の値を変更することは可能ですか? もしそうなら、私はそうするための助けをいただければ幸いです!

ありがとうございました、

ディーン

編集: 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)
4

2 に答える 2

2
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
于 2015-07-22T11:01:33.057 に答える