Возникла ошибка при использовании метода ASM visitJumpInsn()JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Возникла ошибка при использовании метода ASM visitJumpInsn()

Сообщение Anonymous »

Я хочу добавить несколько методов в начало блока кода, поэтому решил переопределить функцию 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»