Anonymous
Возникла ошибка при использовании метода ASM visitJumpInsn()
Сообщение
Anonymous » 01 май 2024, 22:09
Я хочу добавить несколько методов в начало блока кода, поэтому решил переопределить функцию onMethodEnter. Моя цель - напечатать только правильную информацию о имени класса, поэтому я добавляю блок if и использую mv.visitJumpInsn(). Однако я всегда получал ошибку «java.lang.ArrayIndexOutOfBoundsException: индекс 0 выходит за пределы для длины 0». И я был уверен, что проблема в if-block.
Код: Выделить всё
@Override
public void onMethodEnter() {
String enterMethod = "enter " + className + " " + methodName;
//
Label label0 = new Label();
Label label1 = new Label();
Label label2 = new Label();
Label label3 = new Label();
mv.visitTryCatchBlock(label0, label1, label2, "java/io/IOException");
mv.visitLdcInsn(className);
mv.visitLdcInsn("org/example");
mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "contains", "(Ljava/lang/CharSequence;)Z", false);
mv.visitJumpInsn(IFEQ, label3);
mv.visitJumpInsn(GOTO, label0);
mv.visitLabel(label0);
mv.visitTypeInsn(NEW, "java/io/BufferedWriter");
mv.visitInsn(DUP);
mv.visitTypeInsn(NEW, "java/io/FileWriter");
mv.visitInsn(DUP);
mv.visitLdcInsn(filePath);
mv.visitInsn(ICONST_1);
mv.visitMethodInsn(INVOKESPECIAL, "java/io/FileWriter", "", "(Ljava/lang/String;Z)V", false);
mv.visitMethodInsn(INVOKESPECIAL, "java/io/BufferedWriter", "", "(Ljava/io/Writer;)V", false);
mv.visitVarInsn(ASTORE, variable);
mv.visitVarInsn(ALOAD, variable);
mv.visitLdcInsn(enterMethod);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/BufferedWriter", "append", "(Ljava/lang/CharSequence;)Ljava/io/Writer;", false);
mv.visitVarInsn(ALOAD, variable);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/BufferedWriter", "newLine", "()V", false);
mv.visitVarInsn(ALOAD, variable);
mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/BufferedWriter", "flush", "()V", false);
mv.visitLabel(label1);
mv.visitJumpInsn(GOTO, label3);
mv.visitLabel(label2);
mv.visitVarInsn(ASTORE, variable);
mv.visitTypeInsn(NEW, "java/lang/RuntimeException");
mv.visitInsn(DUP);
mv.visitVarInsn(ALOAD, variable);
mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "", "(Ljava/lang/Throwable;)V", false);
mv.visitInsn(ATHROW);
mv.visitLabel(label3);
super.onMethodEnter();
}
Если я удалю блок if, все будет хорошо. Но это не мое требование.
Подробнее здесь:
https://stackoverflow.com/questions/784 ... nsn-method
1714590584
Anonymous
Я хочу добавить несколько методов в начало блока кода, поэтому решил переопределить функцию onMethodEnter. Моя цель - напечатать только правильную информацию о имени класса, поэтому я добавляю блок if и использую mv.visitJumpInsn(). Однако я всегда получал ошибку «java.lang.ArrayIndexOutOfBoundsException: индекс 0 выходит за пределы для длины 0». И я был уверен, что проблема в if-block. [code] @Override public void onMethodEnter() { String enterMethod = "enter " + className + " " + methodName; // Label label0 = new Label(); Label label1 = new Label(); Label label2 = new Label(); Label label3 = new Label(); mv.visitTryCatchBlock(label0, label1, label2, "java/io/IOException"); mv.visitLdcInsn(className); mv.visitLdcInsn("org/example"); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "contains", "(Ljava/lang/CharSequence;)Z", false); mv.visitJumpInsn(IFEQ, label3); mv.visitJumpInsn(GOTO, label0); mv.visitLabel(label0); mv.visitTypeInsn(NEW, "java/io/BufferedWriter"); mv.visitInsn(DUP); mv.visitTypeInsn(NEW, "java/io/FileWriter"); mv.visitInsn(DUP); mv.visitLdcInsn(filePath); mv.visitInsn(ICONST_1); mv.visitMethodInsn(INVOKESPECIAL, "java/io/FileWriter", "", "(Ljava/lang/String;Z)V", false); mv.visitMethodInsn(INVOKESPECIAL, "java/io/BufferedWriter", "", "(Ljava/io/Writer;)V", false); mv.visitVarInsn(ASTORE, variable); mv.visitVarInsn(ALOAD, variable); mv.visitLdcInsn(enterMethod); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/BufferedWriter", "append", "(Ljava/lang/CharSequence;)Ljava/io/Writer;", false); mv.visitVarInsn(ALOAD, variable); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/BufferedWriter", "newLine", "()V", false); mv.visitVarInsn(ALOAD, variable); mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/BufferedWriter", "flush", "()V", false); mv.visitLabel(label1); mv.visitJumpInsn(GOTO, label3); mv.visitLabel(label2); mv.visitVarInsn(ASTORE, variable); mv.visitTypeInsn(NEW, "java/lang/RuntimeException"); mv.visitInsn(DUP); mv.visitVarInsn(ALOAD, variable); mv.visitMethodInsn(INVOKESPECIAL, "java/lang/RuntimeException", "", "(Ljava/lang/Throwable;)V", false); mv.visitInsn(ATHROW); mv.visitLabel(label3); super.onMethodEnter(); } [/code] Если я удалю блок if, все будет хорошо. Но это не мое требование. Подробнее здесь: [url]https://stackoverflow.com/questions/78412281/got-a-error-when-use-asm-visitjumpinsn-method[/url]