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

时间:2016-10-02 03:19:38

标签: 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,那么只需注入代码使用method.insertBefore。

我的问题是如何识别该方法是否包含" super.xxx" 如何插入代码,如上所述。

2 个答案:

答案 0 :(得分:0)

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

此外,您可以使用insertAt()方法,但它始终在指定的行号之前插入。

答案 1 :(得分:0)

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

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

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

这会产生相同的效果,但对行号更改很有效。