2017-04-12 8 views
1

私は今、このエラーを数時間後に調べようとしていますが、何が原因であろうと考えていません。私はクラスファイルにコードを注入しようとしています。 奇妙なことは、ClassWriter.COMPUTE_MAXSでは注入がうまくいくが、ClassWriter.COMPUTE_FRAMESを使うとArrayIndexOutOfBoundsExceptionがスローされるということだ。編集したクラスを実行するには、COMPUTE_FRAMESを使用する必要があります。ASM 5.2 ClassReader.accept throws 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 
    } 
} 

私は(多分これは何とかあなたを助けます)

マイコードをASM 5.2を使用して、これまでCOMPUTE_FRAMESは2の値を持つことだけがわかっています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

コンパイル済みのjarを使用してASMのSVN isnteadからソースを取得する必要があります。 'a'や' b'のような名前のない完全なスタックトレースを見ることができます。問題自体については、無効なバイトコードで変更を加えるとフレームの生成が失敗する傾向があります。 '// InjectCodeHere、それはエラーを引き起こしていない可能性が高いため削除されました'これは実際に起こった可能性が高いです。 –

答えて

1

@ display-nameのおかげで、エラーが見つかりました。 「ModifierMethodWriter」で

super.visitMaxs(4, 2); 

、私は実際にここに表示されませんでしたコードは、エラーの原因となりました。

関連する問題