2017-04-12 145 views
1

我现在正在试图找出这个错误我们,因为几个小时,我硬是不知道可能会导致它。我正在尝试将代码注入类文件。 奇怪的是,注射工作正常ClassWriter.COMPUTE_MAXS,但抛出,如果我用ClassWriter.COMPUTE_FRAMES一个ArrayIndexOutOfBoundsException。我需要使用COMPUTE_FRAMES才能运行编辑过的类。我使用ASM 5.2,只出这么远的是COMPUTE_FRAMES具有为2的值(也许这可以帮助你以某种方式)ASM 5.2 ClassReader.accept抛出ArrayIndexOutOfBoundsException异常: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 
    } 
} 

ModifierClassWriter:

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) 
+0

你应该使用他们的编译罐子ASM的SVN isntead源。它会让你看到完整的堆栈轨迹,没有像“a”或“b”这样的名字。对于问题本身,帧生成往往在修改您在无效的字节码结果失败。 '// InjectCodeHere,去掉它,因为它很可能不导致的error'这实际上可能是什么原因造成的。 –

回答

1

感谢@显示的名字,我发现了错误。

super.visitMaxs(4, 2); 

在“ModifierMethodWriter”引起的错误,我其实没有在这里显示的代码。