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

#java #javassist

#java #javassist

Вопрос:

 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 , то просто введите код, используя метод.insertBefore .

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

Ответ №1:

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

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

Ответ №2:

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

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

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

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