メソッド内のすべてのラベルのオフセットを取得しようとしています。Javaバイトコード - ASM - ラベルオフセットの取得
私は、次のコードを使用してみました:getOffset()
方法はException
をスローしかし
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;
}
を:
java.lang.IllegalStateException: Label offset position has not been resolved yet
どのように私はこれらのオフセット位置を解決することができますか?またはこれを達成するための適切な方法は何ですか? 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