目标
我的课程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();