我试图在方法中获取所有标签的偏移。
我尝试使用以下代码:
private static ArrayList<Integer> GetLabelOffsets(MethodNode methodNode) {
ArrayList<Integer> labelOffsets = new ArrayList<>();
for (AbstractInsnNode instruction : methodNode.instructions.toArray()) {
if (instruction instanceof JumpInsnNode) {
JumpInsnNode jumpInsnNode = (JumpInsnNode) instruction;
labelOffsets.add(jumpInsnNode.label.getLabel().getOffset());.
}
}
return labelOffsets;
}
但是getOffset()
方法抛出Exception
:
java.lang.IllegalStateException: Label offset position has not been resolved yet
如何解决这些偏移位置?或实现这一目标的正确方法是什么?
编辑
MethodNode
是Java ASM库中的org.objectweb.asm.tree.MethodNode
对象
按请求添加更多代码:
public static HashMap<String, ClassNode> ParseJar(JarFile jar) {
HashMap<String, ClassNode> classes = new HashMap<>();
try {
Enumeration<?> enumeration = jar.entries();
while (enumeration.hasMoreElements()) {
JarEntry entry = (JarEntry) enumeration.nextElement();
if (entry.getName().endsWith(".class")) {
ClassReader classReader = new ClassReader(jar.getInputStream(entry));
ClassNode classNode = new ClassNode();
classReader.accept(classNode, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
classes.put(classNode.name, classNode);
}
}
jar.close();
return classes;
} catch (Exception ex) {
return null;
}
}
public static void main(String[] args) {
JarFile jar = new JarFile(fileName);
HashMap<String, ClassNode> classes = JarUtils.ParseJar(jar);
for (ClassNode classNode : classes.values()) {
for (MethodNode methodNode : classNode.methods) {
ArrayList<Integer> offsets = GetLabelOffsets(methodNode);
// do more stuff with offsets
}
}
}
来自 getOffset()
的文档:
此方法用于属性子类,通常不需要类生成器或适配器。
由于此偏移是根据 bytes 定义的,因此在处理指令列表 的列表时,这不是很有帮助的,尤其是因为ASM摘要不同形式的指令形式在字节代码中可能具有不同的长度。
一般的想法是可以更改此指令列表,因此Label
s表示逻辑位置,并且在编写方法的结果字节码和实际数字时将计算偏移。
在指令列表中,应该有一个相应的LabelNode
引用与指令相同的Label
。