#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.
}
Это будет иметь тот же эффект, но устойчиво к изменениям номера строки.