ASM 5.2 ClassReader.accept 抛出 ArrayIndexOutOfBoundsException:2

ASM 5.2 ClassReader.accept throws ArrayIndexOutOfBoundsException:2

我几个小时前就开始尝试找出这个错误,但我完全不知道是什么原因导致的。我正在尝试将代码注入 class 文件。 奇怪的是,对于 ClassWriter.COMPUTE_MAXS,注入工作正常,但如果我使用 ClassWriter.COMPUTE_FRAMES,则会抛出 ArrayIndexOutOfBoundsException。我需要使用 COMPUTE_FRAMES 才能 运行 编辑后的 ​​Class。我使用的是 asm 5.2,目前只发现 COMPUTE_FRAMES 的值为 2(也许这对你有所帮助)

我的代码:

    InputStream in = new FileInputStream("Paht/To/Class.class");
    ClassReader classReader = new ClassReader(in);
    ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES){
        @Override
        protected String getCommonSuperClass(final String type1, final String type2){
            return "java/lang/Object";
        }
    };

    ClassVisitor mcw = new ModifierClassWriter(Opcodes.ASM5, cw);
    classReader.accept(mcw, 0);

    File outputDir = new File("Path/To/Output/dir");
    outputDir.mkdirs();
    DataOutputStream dout = new DataOutputStream(new FileOutputStream(new File(outputDir, "NameOfFile.class")));
    dout.write(cw.toByteArray());
    dout.close();

修饰符方法作者:

    public static class ModifierMethodWriter extends MethodVisitor{

    private String methodName;

    public ModifierMethodWriter(int api, MethodVisitor mv, String methodName) {
        super(api, mv);
        this.methodName = methodName;
    }
    @Override
    public void visitCode() {
        super.visitCode();
    //InjectCodeHere, removed it because it most likely doesnt cause the error
    }
}

修改者Class作者:

    public static class ModifierClassWriter extends ClassVisitor{
    private int api;
    public ModifierClassWriter(int api, ClassWriter cv) {
        super(api, cv);
        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);
        ModifierMethodWriter mvw = new ModifierMethodWriter(api, mv, name);
        return mvw;
    }
}

错误:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.Frame.a(Unknown Source)
at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
at org.objectweb.asm.MethodVisitor.visitMaxs(Unknown Source)
at org.objectweb.asm.ClassReader.a(Unknown Source)
at org.objectweb.asm.ClassReader.b(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at org.objectweb.asm.ClassReader.accept(Unknown Source)
at package.main.ClassMaker.main(ClassMaker.java:28)

感谢@display-name,我找到了错误。

super.visitMaxs(4, 2);

在"ModifierMethodWriter"中导致错误,我实际上没有在这里显示的代码。