Java BCEL getfield指令

时间:2018-03-11 01:18:32

标签: java field bytecode bytecode-manipulation bcel

目标

我的课程A有一个名为getStr的方法。我想在BCEL中使用Instructionlist复制方法内的代码。

public class A {
    private String str;

    private String getStr() {
        return this.str;
    }
}

问题

我尝试了以下代码,但没有成功,因为它在以后运行修改后的类java.lang.NoClassDefFoundError时会导致A。我认为GETFIELD正在导致它,因为它没有它(其他指令略有修改)。

il.append(new ALOAD(0)); // Load .this
il.append(new GETFIELD(poolGen.addFieldref("A", "str","Ljava/lang/String;"))); // Causes problem
il.append(new ARETURN()); // Return the field

MethodGen methodGen = new MethodGen(
                Constants.ACC_PRIVATE,
                Type.STRING,
                null,
                null,
                "getStr",
                "A",
                il,
                poolGen);

il.setPositions();
methodGen.setMaxLocals();
methodGen.setMaxStack();
methodGen.removeLineNumbers();

myClassGen.replaceMethod(macMethod, methodGen.getMethod());
myClassGen.update();

问题

那么使用BCEL创建getfield指令的正确方法是什么?

注意: 我使用BCEL创建private String str;字段,代码为:

FieldGen fieldGen1 = new FieldGen(Constants.ACC_PRIVATE, Type.STRING, "str", poolGen);
myClassGen.addField(fieldGen1.getField());
myClassGen.update();

0 个答案:

没有答案