【发布时间】:2011-04-16 20:41:49
【问题描述】:
大家好, 我正在尝试使用 ASM 字节码 Tree Api 对类进行静态分析。 我想我有一个非常基本的问题。在一个说 foobar() 的方法中,我在 foobar 中有一个指令列表(InsnList 有一个列表)。现在我想检查是否在第 10 条指令处,是否调用了函数“barfoo(String args)”。
另外,我需要验证特定指令是否是条件指令。
感谢和问候, SJ
注意:我已经可以读取一个类并找到我感兴趣的特定方法并遍历该方法的每个指令。
已解决(参见:Greg 的 cmets):
AbstractInsnNode s = ...
if(s.getType()==AbstractInsnNode.METHOD_INSN){
MethodInsnNode methodInvocationNode = (MethodInsnNode) s;
if(methodInvocationNode.name.equals("barfoo"))
{
return true;
}
}
【问题讨论】:
-
感谢 Chris.... dint 知道我们应该这样做.... 做 nw
-
你知道各个JVM指令是什么意思吗?只是想弄清楚你从这里开始的地方。
-
是的,我愿意……我已经阅读了 ASM 手册……
-
那有什么问题呢?给定偏移量 10 处的指令,您应该知道如何确定那里的字节码是否正在调用特定函数。同样,给定一个特定指令,确定它是否是条件指令应该是微不足道的。
-
没错,invokespecial是可以调用方法的字节码之一(还有几个)。看起来你必须在你的指令节点上调用
getType(),如果类型是METHOD_INSN,那么你可以转换为MethodInsnNode。从那里,查看.name以查看方法名称。
标签: java bytecode instrumentation bytecode-manipulation java-bytecode-asm