2017-03-22 6 views
1

私はクラスのインストルメンテーションが必要なプロジェクトに取り組んでいます。私はjavassistを使用しています。私の場合は計測を行うのがとても便利です。javassist:クラスとフィールドの名前の種類の変更

私は、次のコードスニペットを使用して記述することができ、問題に直面しています:

と仮定クラス1:

public class Class1 { 
    Class2 class2; 
} 

とクラス2:

public class Class2 { 
    //Code 
} 

とする機能を定義されたクラスからCtClassが取得され、コード変換が行われます。

public void testFunction() throws NotFoundException { 
     ClassPool classPlool; 
     classPlool = ClassPool.getDefault(); 
     CtClass ctCls1 = classPlool.getAndRename("Class1", "Class1_V1"); 
     // instrument and load ctCls1 etc. 
     CtClass ctCls2 = classPlool.getAndRename("Class2", "Class2_V1"); 
     // instrument and load ctCls1 etc. 
    } 

として、私はクラスの名前を変更していますので、Class1のフィールドClass2 class2はタイプclass Class2のですが、そのクラスはClass2_V1に変更されます。フィールドのタイプをLClass2からLClass2_V1に変更したいと思います。

ctCls1がある:[email protected][changed public class Class1_V1 fields=Class1_V1.class2:LClass2;, [email protected][public Class1_V1()V], methods=]

PS:私は別の計測器でのクラスの2つのバージョンをロードするようにしましたので、私の場合は最良の方法です。また、私は問題を探しましたが、それに対処する解決策はありません。this linkはフィールドの名前を変更すると説明しますが、タイプは記述しません。 Javassistdocumentationによると

+0

を通してそれを得る私はいつも「_V1」または「_v2を追加することに注意してください'だから、あなたが 'LClass1_V1'や 'LClass1_V2'の名前を変更するのを手助けすれば十分でしょう。 – Aadarsh

+0

フィールドを完全に削除してから、新しい名前と新しいタイプのフィールドを追加できませんか? – Nicholas

+0

'setType()'の追加と削除の違いはありません – Aadarsh

答えて

1

新しいクラスは既存のクラスのコピーとして定義することができます。このプログラムは、ファーストクラスのポイントのCtClassオブジェクトを取得

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("Point"); 
cc.setName("Pair"); 

:以下のプログラムがあることありません。

次に、setName()を呼び出して、新しい名前のペアをCtClassオブジェクトに割り当てます。

この呼び出しの後、そのCtClassオブジェクトによって表されるクラス定義内のクラス名のすべての出現が、PointからPairに変更されます。クラス定義の他の部分は変更されません。

EDIT: クラスにフィールド型の名前を変更するためには、あなたがクラスをナビゲートすることができ、JavassistタイプCtField

ClassPool pool = ClassPool.getDefault(); 
CtClass cc = pool.get("Class1"); 
CtField cf = cc.getField("class2NameIntoClass1"); 
CtClass cc2 = cf.getType(); 
cc2.setName("Class2NewName"); 
+0

私は 'class2'の名前を変更していますが、' class1'は 'class2'型のフィールドを持っています。 'class1'の型の名前を変更してください。 – Aadarsh

関連する問題