【发布时间】:2014-06-05 06:26:41
【问题描述】:
我正在尝试通过字节码操作(使用ASM framework)记录实例级别(或类级别)对象初始化或对象分配
类似这样的:
这是我声明一些实例变量的类:
class DeclarationTestClass1{
/** Assume This Class has some public instance variables **/
private MultipleDeclarationTestClass multiClass = null;
private List<String> arrayList1_String = null;
public static Hashtable<Integer,Integer> staticHashTable = null;
public List<String> getArrayList1_String() {
return arrayList1_String;
}
public void setArrayList1_String(List<String> arrayList1_String) {
this.arrayList1_String = arrayList1_String;
}
}
现在,我想做:
DeclarationTestClass1 object1 = new DeclarationTestClass1();
MultipleDeclarationTestClass object1 .object1_innerObject = new MultipleDeclarationTestClass();
RecordingClass.recordingMethod(object1.arrayList1_String = new ArrayList<String>());
RecordingClass.recordingMethod(object1 .object1_innerObject.someMap = new HashMap<String,String>());
现在,当我使用 ASMifier 看到所需类的输出时,我可以看到在调用实际的 putfield 之前,有一个 DUP_X1 被调用。
现在,我的理解是,由于实例级对象是通过另一个对象引用的(即:object1.arrayList1_String = new ArrayList<String>(),堆栈的第二个字包含它所引用的对象(即object1)。
如果我错了,请纠正我。
但是,我无法理解的是,在第二种情况下,当实例级对象通过另一个额外的对象(即:object1 .object1_innerObject.someMap = new HashMap<String,String>())被引用时,它在堆栈中还有另一个额外的对象,对吧?
所以我的问题是:
1) 为什么在第二种情况下也会调用DUP_X1?
2) 我在 asm 中使用 COMPUTE_MAXS 标志,其中 asm 为我计算最大堆栈大小。那么,如果我不覆盖MethodVisitor 中的visitMaxs 方法,这种复制是否会产生影响。
非常感谢您在这方面的任何帮助。
【问题讨论】:
标签: java bytecode java-bytecode-asm bytecode-manipulation