8

私はJavassistの初心者であり、それに関連するいくつかのチュートリアルをすでに読んでいます。

各メソッドでバイトコードインジェクションを実行する必要があるため、メソッドの入力または終了の前に、これからいくつかの統計を取得します。

オンラインのjavassitチュートリアルを通じて、既存のクラスに新しいフィールドを作成できることがわかりました。

CtClass point = ClassPool.getDefault().get("Point");
CtField f = new CtField(CtClass.intType, "z", point);
point.addField(f);

ただし、CtFieldの型にはデフォルトでプリミティブ型しか含まれていません。たとえば、ArrayListなど、型が非プリミティブである新しいフィールドを追加できますか?

新しいArrayListフィールドを既存のクラスに追加できる場合、クラスはjava.util.ArrayListをインポートしないため、コンパイルエラーが発生しますか?

4

1 に答える 1

10

はい、非プリミティブフィールドを追加できます。通常はClassPoolを介して、フィールドのクラスへのハンドルを取得する必要があります。使用するクラスの完全修飾名が必要になることに注意してください。

CtClass arrListClazz = ClassPool.getDefault().get("java.util.ArrayList");
CtClass point = ClassPool.getDefault().get("Point");
CtField f = new CtField(arrListClazz, "someList", point);
point.addField(f);
于 2012-02-19T08:18:35.610 に答える