我想使用 Javassist 来检测一个源代码不受我控制的 Java 类(Java 1.6.0_26-b03,Javassist 3.16.1-GA)。
我对 Javassist 比较陌生,但我想我知道它背后的概念。我读了很多关于它的东西,但也许我错过了一些东西。请看下面的,非常简单的代码:
文件 ParentPrivateMethodInstrumentingTest.java:
package test.javassist;
import javassist.*;
public class ParentPrivateMethodInstrumentingTest
{
public ParentPrivateMethodInstrumentingTest() throws Exception
{
ClassPool classPool = ClassPool.getDefault();
CtClass childCtClass = classPool.get( "test.javassist.Child" );
CtMethod parentCtMethod = childCtClass.getMethod( "parent", "()V" );
parentCtMethod.insertBefore( "{ System.err.println( \"-- before parent() --\" ); }" );
Child child = (Child)childCtClass.toClass().newInstance();
child.parent();
}
public static void main( String[] args ) throws Exception
{
new ParentPrivateMethodInstrumentingTest();
}
}
文件 Parent.java:
package test.javassist;
public class Parent
{
private void privateParent()
{
System.out.println( "Parent.privateParent()" );
}
public void parent()
{
System.out.println( "Parent.parent()" );
privateParent();
}
}
文件 Child.java:
package test.javassist;
public class Child extends Parent
{
}
当我运行这个程序时,输出是:
Parent.parent()
Parent.privateParent()
所以我的问题是,为什么在 parent() 之前没有行“--”,我认为它已插入到字节码中?
不可能像我在父类的私有方法上尝试过的那样进行代码插入吗?
非常感谢你的帮助!