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()

だから私の質問は、バイトコードに挿入されたと思っていた「-- before parent() --」という行がないのはなぜですか?

親クラスのプライベート メソッドで試した方法でコードを挿入することはできませんか?

助けてくれてどうもありがとう!

4

1 に答える 1

3

フレームワークの作成者の助けのおかげで、問題がどこにあるのかヒントを得たので、ここで解決策を共有したいと思います. 親クラスのメソッドを変更するため、そのクラスもロードする必要があります

childCtClass.getSuperclass().toClass();

行の直後

parentCtMethod.insertBefore

千葉茂先生に感謝いたします。

于 2012-04-16T10:58:56.190 に答える