如何使用Javassist在super.xxx()之后插入代码

如何使用Javassist在super.xxx()之后插入代码,java,javassist,Java,Javassist,我想使用javassist在super.xxx之后插入一些代码,例如: class A extends B{ public void a(){ super.a(); System.out.println("hello"); } } 如果源代码不包含super.xxx,则只需使用method.insertBefore注入代码 我的问题是如何识别该方法是否包含“super.xxx” 以及如何像上面描述的那样插入代码。根据您的代码,它看起来是要插入代码的方法的结尾,因此您可以使用Cl

我想使用javassist在super.xxx之后插入一些代码,例如:

class A extends B{
public void a(){
    super.a();
    System.out.println("hello");
}
}
如果源代码不包含super.xxx,则只需使用method.insertBefore注入代码

我的问题是如何识别该方法是否包含“super.xxx”
以及如何像上面描述的那样插入代码。

根据您的代码,它看起来是要插入代码的方法的结尾,因此您可以使用
ClassPool
insertAfter()
方法在特定方法的结尾添加行


您也可以使用
insertAt()
方法,但它总是在指定的行号之前插入。

Javassist允许您使用该方法在特定行号处添加代码。但是请注意,这需要编译代码以包含此类行号信息。另外请注意,这通常不是一个好方法,因为更改代码会中断程序或在错误的时间触发代码

在调用super方法之后,是否尝试执行代码?如果是这样,请尝试使用
CtBehavior::insertAfter
检测超类
B
,以包含以下代码:

class A extends B{
public void a(){
    super.a();
    System.out.println("inject"); // javassist 
    System.out.println("hello");
}
}
这将具有相同的效果,但对行号变化具有鲁棒性

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