我試圖檢索實現Java接口的類的名稱,然後使用此名稱作爲數據結構中的鍵來檢索有關該類的一些代碼度量標準。這是我所做的:重新加載ASM中的局部變量
public void visitMethodInsn(int opcode, String owner, String name, String desc) {
int methodOwner = _lvs.newLocal(Type.getType("Ljava/lang/String;"));
if (opcode == Opcodes.INVOKEINTERFACE) {
// some code to pop the operand stack and
// get to the object whose method is being called
// retrieving the name of the class
int callingObj = _lvs.newLocal(Type.getType(Object.class));
this.visitVarInsn(Opcodes.ASTORE, callingObj);
this.visitVarInsn(Opcodes.ALOAD, callingObj);
this.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Object", "getClass", "()Ljava/lang/Class;");
this.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "java/lang/Class", "getName", "()Ljava/lang/String;");
this.visitVarInsn(Opcodes.ASTORE, methodOwner);
this.visitVarInsn(Opcodes.ALOAD, callingObj);
/// (1)
/// some code using the methodOwner ....
/// something like the following
/// this.visitVarInsn(Opcodes.ALOAD, methodOwner);
/// code to reconstruct the operand stack
/// for the method to be invoked
}
super.visitMethodInsn(opcode, owner, name, desc);
if (opcode == Opcodes.INVOKEINTERFACE) {
/// (2)
/// some more code using the methodOwner .....
///
/// this.visitVarInsn(Opcodes.ALOAD, methodOwner);
}
}
如果我從上面的代碼註釋塊(2)中的代碼片段,它的工作原理。但是,當我嘗試訪問塊(2)中的「methodOwner」時,我收到以下驗證錯誤,指出字符串對象不見了。我不明白爲什麼。
org.objectweb.asm.tree.analysis.AnalyzerException: Error at instruction 813: Expected an object reference, but found .
由於主叫「super.visitMethodInsn(操作碼,所有者,名稱,內容描述);」彈出調用接口方法的對象,我無法再次獲取對它的引用。我試着在另一個變量中保留對象的第二個副本,但同樣的問題發生。
我想知道你是否對這裏有什麼問題有任何線索,如果你能給我一些建議。
非常感謝您的幫助
我應該在這裏添加的一件事是,在方法(1)中的代碼執行時沒有任何問題,將變量添加到方法中首先工作。它只是在調用** super.visitMethodInsn **之後才能訪問新添加的變量。 – nemo