I need to know the name of the object which called invokevirtual operation(in the following format - Objectname@object_id). Is it possible given only MethodInsnNode object? I know that it is stored with the index 0 in local variables but I don't know how to get it.
问问题
929 次
2 回答
1
您需要 MethodNode 才能访问局部变量。
如果您在变量中有关联的 MethodNodemn
并且您的 MethodInsnNode 存储在其中insn
:
InsnList insnList = mn.instructions;
int instructionIdx = insnList.indexOf(insn);
String name = null;
int wantedLocalVariableIndex = 0;
for (LocalVariableNode lvn : mn.localVariables) {
if (lvn.index == wantedLocalVariableIndex && insnList.indexOf(lvn.start) < instructionIdx && instructionIdx < insnList.indexOf(lvn.end)) {
name = lvn.name;
break;
}
}
if (name != null) {
// we found it's name
}
于 2013-02-22T22:58:05.380 回答
0
这是我在 JavaFlow 库的分支中解决这个难题的方法。有关确切的实现,请查看我的 Github 存储库中的 CallSiteFinder.java。
思路如下。当您有方法指令时,您可能会获得正确方法调用所需的必要堆栈大小
Type.getArgumentsAndReturnSizes(methodInsnNode.desc) >> 2
现在从给定的 MethodInsnNode 开始反向移动指令列表,并根据遇到的每条指令的 OPCode 减小获得的堆栈大小。继续,直到您的尺寸为零。此时,您有一个用于“this”的指令节点——实例方法调用的第一个参数。它可能是 ALOAD(包括您正在访问的方法的这个 - “ALOD 0”)、AALOAD、GETSTATIC、GETFIELD 或前一个方法调用的结果,当几个方法调用被链接起来时
StringBuilder.append(...).append(..)
于 2015-11-20T14:34:06.783 回答