繁体   English   中英

Java asm从方法变量中获取“ this”对象

[英]Java asm get “this” object from method variables

我需要知道称为invokevirtual操作的对象的名称(以下格式-Objectname @ object_id)。 是否可以仅使用MethodInsnNode对象? 我知道它与索引0一起存储在局部变量中,但是我不知道如何获取它。

您需要MethodNode才能访问局部变量。

如果您在变量mn具有关联的MethodNode并且您的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
}

这是我在JavaFlow库的分支中解决此难题的方法。 对于确切的实现,请查看我的Github存储库中的CallSiteFinder.java

这个想法如下。 当您有方法说明时,您可能会获得正确的方法调用所需的必要堆栈大小

Type.getArgumentsAndReturnSizes(methodInsnNode.desc) >> 2

现在按指令列表从给定的MethodInsnNode开始沿相反方向移动,并根据遇到的每条指令的OPCode减小获得的堆栈大小。 继续直到您的大小为零。 此时,您有一个用于“ this”的指令节点-实例方法调用的第一个参数。 可能是ALOAD(包括您正在访问的方法的此名称-“ ALOD 0”),AALOAD,GETSTATIC,GETFIELD或将多个方法调用链接在一起时来自先前方法调用的结果

StringBuilder.append(...).append(..)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM