2

是否可以从 java 字节码中读取或识别 INVOKESPECIAL 指令引用的类?如果是,如何?另外,我怎么知道跳转后执行的下一行是什么?

请记住,我想制作一个执行此操作的程序。我正在尝试做的是找到一种仅通过字节码自动本地化异常处理的方法。

4

2 回答 2

1

你可以查看这个关于http://asm.ow2.org/的框架。“ASM 框架是用于进行字节码操作的最快、最灵活和众所周知的框架”

于 2012-12-18T10:18:55.503 回答
0

有很多框架用于字节码操作。但我个人更喜欢ASM。它的类似 XML 解析的机制更容易学习。

例如,您可以使用此代码列出INVOKESPECIALjar 文件中的所有调用:它将打印如下行:

INVOKESPECIAL[ opcode=183, owner=java/lang/StringBuilder, name=<init>, desc=()V].

可以说是被引用的<init>函数。java/lang/StringBuilderINVOKESPECIAL

JarFile jarFile = new JarFile("xxx.jar");
Enumeration<JarEntry> entries = jarFile.entries();

while (entries.hasMoreElements()) {
    JarEntry jarEntry = entries.nextElement();
    if (jarEntry != null && jarEntry.getName().endsWith(".class")) {
        InputStream eis = jarFile.getInputStream(jarEntry);
        ClassReader classReader = new ClassReader(eis);
        ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS);
        MyClassVisitor mcw = new MyClassVisitor(Opcodes.ASM4, cw);
        classReader.accept(mcw, 0);
        eis.close();
    }
}


class MyClassVisitor extends ClassVisitor {
private int api;
public MyClassVisitor(int api, ClassWriter cw) {
    super(api, cw);
    this.api = api;
}
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
    return new MyMethodVisitor(api, mv);
}
class MyMethodVisitor extends MethodVisitor {

    public MyMethodVisitor(int api, MethodVisitor mv) {
        super(api, mv);
    }
    @Override
    public void visitMethodInsn(int opcode, String owner, String name, String desc) {
        if (opcode == Opcodes.INVOKESPECIAL) {
            System.out.println("INVOKESPECIAL[ opcode=" + opcode + ", owner=" + owner + ", name=" + name
                    + ", desc=" + desc+"]");
        }
        super.visitMethodInsn(opcode, owner, name, desc);
    }
}
}
于 2012-12-18T19:54:42.853 回答