私は今、このエラーを数時間後に調べようとしていますが、何が原因であろうと考えていません。私はクラスファイルにコードを注入しようとしています。 奇妙なことは、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)
コンパイル済みのjarを使用してASMのSVN isnteadからソースを取得する必要があります。 'a'や' b'のような名前のない完全なスタックトレースを見ることができます。問題自体については、無効なバイトコードで変更を加えるとフレームの生成が失敗する傾向があります。 '// InjectCodeHere、それはエラーを引き起こしていない可能性が高いため削除されました'これは実際に起こった可能性が高いです。 –