2012-04-13 18 views
3

Javassistを使用して、ソースが管理できないJavaクラス(Java 1.6.0_26-b03、Javassist 3.16.1-GA)を計測したいと考えています。Javassistを使用して親クラスのプライベートメソッドをインスツルメントしますか?

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

なぜ私はバイトコードに挿入されていると思う " - (親)の前に"という行がないのですか?

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

ありがとうございました!

答えて

3

フレームワークの作成者の助けを借りて、私は問題があるヒントを得たので、ここで解決策を共有したいと思います。私は親クラスのメソッドを変更するので、そのクラスはまた、右のライン

parentCtMethod.insertBefore 

後、マイおかげで教授千葉繁に行く

childCtClass.getSuperclass().toClass(); 

をロードする必要があります。

+1

@ It's Leto:最終的な完全版を編集してください。それは良い参照として動作します – Jayan

関連する問題