Как использовать коды вставки Javassist после super.xxx()

class A extends B{
public void a(){
    super.a();
    System.out.println("hello");
}
}

Я хочу использовать javassist для вставки некоторых кодов после super.xxx, например:

class A extends B{
public void a(){
    super.a();
    System.out.println("inject"); // javassist 
    System.out.println("hello");
}
}

если исходные коды не содержат super.xxx, то просто введите код, используя method.insertBefore .

Мой вопрос заключается в том, как определить, содержит ли метод "super.xxx", и как я могу вставить коды, как описано выше.

2 ответа

В соответствии с вашим кодом это выглядит как конец метода, в который вы хотите вставить код, чтобы вы могли использовать ClassPoolinsertAfter() метод, чтобы добавить строки в конце конкретного метода.

Также вы можете пользователь insertAt() метод, но он всегда вставляется перед указанным номером строки.

Javassist позволяет добавлять код на определенный номер строки, используя CtBehavior::insertAtметод. Однако обратите внимание, что для этого необходимо, чтобы вы скомпилировали свой код с -g возможность включить такую ​​информацию о номере строки. Также обратите внимание, что это, как правило, не очень хороший подход, так как изменение вашего кода сломает вашу программу или вызовет ваш код в неправильное время.

Вы пытаетесь выполнить код после вызова метода super? Если это так, попробуйте инструменты супер класса B содержать следующий код, используя CtBehavior::insertAfter:

if (this instanceof A) {
  // your code goes here.
}

Это имело бы тот же эффект, но устойчиво к изменениям номера строки.

Другие вопросы по тегам