메소드의 모든 라벨의 오프셋을 가져 오려고합니다.자바 바이트 코드 - ASM - 라벨 오프셋 가져 오기
나는 다음과 같은 코드를 사용하여 시도:
java.lang.IllegalStateException: Label offset position has not been resolved yet
어떻게 이러한 위치를 오프셋 해결할 수 있습니다
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
을 발생하지만를? 아니면 이것을 달성하기위한 적절한 방법은 무엇입니까? documentation of getOffset()
에서
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
}
}
}
[최소, 완료 및 확인 가능한 예] (https://stackoverflow.com/help/mcve)를 제공해주십시오. –
업데이트 해 주셔서 감사합니다! 문제를 재현하기 위해 jar 파일을 프로그램 입력으로 사용해야합니까? –
모든 jar 파일이 수행해야합니다. 바이트 코드에 (비) 조율 점프가 포함되어있는 한. – eKKiM