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() --」という行がないのはなぜですか?
親クラスのプライベート メソッドで試した方法でコードを挿入することはできませんか?
助けてくれてどうもありがとう!