Как использовать коды вставки 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 ответа
В соответствии с вашим кодом это выглядит как конец метода, в который вы хотите вставить код, чтобы вы могли использовать ClassPool
insertAfter()
метод, чтобы добавить строки в конце конкретного метода.
Также вы можете пользователь insertAt()
метод, но он всегда вставляется перед указанным номером строки.
Javassist позволяет добавлять код на определенный номер строки, используя CtBehavior::insertAt
метод. Однако обратите внимание, что для этого необходимо, чтобы вы скомпилировали свой код с -g
возможность включить такую информацию о номере строки. Также обратите внимание, что это, как правило, не очень хороший подход, так как изменение вашего кода сломает вашу программу или вызовет ваш код в неправильное время.
Вы пытаетесь выполнить код после вызова метода super? Если это так, попробуйте инструменты супер класса B
содержать следующий код, используя CtBehavior::insertAfter
:
if (this instanceof A) {
// your code goes here.
}
Это имело бы тот же эффект, но устойчиво к изменениям номера строки.