3

我想使用 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() 之前没有行“--”,我认为它已插入到字节码中?

不可能像我在父类的私有方法上尝试过的那样进行代码插入吗?

非常感谢你的帮助!

4

1 回答 1

3

感谢框架作者的帮助,我得到了问题所在的提示,我想在这里分享解决方案。由于我修改了父类的方法,因此该类也必须加载

childCtClass.getSuperclass().toClass();

就在这条线之后

parentCtMethod.insertBefore

我要感谢 Shigeru Chiba 教授。

于 2012-04-16T10:58:56.190 回答