DevFaqJavaModelAddFeatureJa
プログラムからJavaのソースにメソッドを追加する方法は?
注意: この FAQ 項目は NetBeans 4.x および 5.x にのみ適用されます。NetBeans 6 では Java 解析の基盤が新しいAPIに置き換えられました。
まず、対象となるJavaのファイルに対する Resource を取得する必要があります。エディタで開いているファイルに対してこの処理を行いたい場合は次のようにします:
JMIUtils utils = JMIUtils.get(baseDoc); Resource resource = utils.getResource();
ドキュメントオブジェクト baseDoc の取得元については、 getting the document in the current editor を参照してください。
DataObject から取得する場合は、次のようにします:
Resource resource = JavaModel.getResource ( dob.getPrimaryFile () );
Resourceは .java あるいは .class ファイルのモデル実装で、0個以上のJavaのクラスとimport宣言を含みます。
次に、編集したいJavaのクラスに対する JavaClass 取得します。 resource.getClassifiers() を呼び出し、返却されるコレクション内でいてレーションを回して下さい(ただし JDK 1.0 式のソースの場合は別で、ファイルと同名のJavaClassが一つだけ返されます)。
これで JavaClass が取得できましたので、ここにメソッドを追加していきます。このクラスには、"機能" のリスト(メソッド、フィールド、初期化子、その他もろもろ)を返す getFeatures() というメソッドが用意されていて、取得したリストに追加したいメソッド・オブジェクトを add してやれば、そのメソッドをクラスに追加することができます(このリスト・オブジェクトの扱いには十分注意してください。リストから何らかのオブジェクトを削除すると、それに対応するコードがリアルタイムにソースから削除されてしまいます)
ところで、メソッド・オブジェクトはどこから取得するのでしょう?
少々分かりにくいのですが、メソッド・オブジェクト(およびその他色々)のプロトタイプを作成するのはリポジトリ・パッケージ(クラスパス属性に対応するリポジトリ・パッケージ - 与えられたクラスパス属性に関する全てのメタ・データのコンテナ/データベースとして提供される)をあらわすオブジェクトで、ここから取得したオブジェクトをクラスクラスパス属性にあるクラスに追加するのです。というわけで、
JavaModelPackage jpck = (JavaModelPackage) resource.refImmediatePackage();
――というコードで必要なオブジェクトを取得できます。あるいは MethodClass、 ArrayClass というような全くもって曖昧な名前のオブジェクトが返される場合もあり、これらをファクトリとして利用することになります。ここで、jpck.getMethod().createMethod() を呼び出すわけです。この時、body、javadoc、argumentsなど、目的に沿った引数を取るメソッドを呼び出すようにしてください。もしくは、とりあえずMethodオブジェクトを取得しておき、そのあとで setBodyText() などを呼び出しても良いでしょう。
なお、これらの処理はモデルに対する書き込みロックを保持している間に行なう必要がありますので、エントリ・ポイントにおいては、おそらく次のような処理を書くことになるでしょう。
JavaModel.getJavaRepository().beginTrans(true);
boolean rollback = true;
try {
// get the resource corresponding to a given file
Resource res = JavaModel.getResource(fileObject);
// get the first class from the resource
JavaClass cls = (JavaClass) res.getClassifiers().get(0);
// create a new method
JavaModelPackage jmp = (JavaModelPackage) cls.refImmediatePackage();
Method method = jmp.getMethod().createMethod();
method.setName("getFour");
method.setModifiers(Modifier.PUBLIC | Modifier.STATIC);
method.setType(jmp.getType().resolve("int"));
method.setBodyText("return 4;");
// add the method to the class
cls.getFeatures().add(method);
rollback = false;
} finally {
JavaModel.getJavaRepository().endTrans(rollback);
}
必要となる全てのクラスにアクセスできるようにするためには、おそらく、依存性のある全てのヒープをモジュールに追加する必要があるでしょう。おそらくこれらはリファクタリング・モジュールが保持していますので、project.xmlからコピーして使います。プロジェクトのプロパティを利用して追加する場合は、ライブラリタブを選択して「ライブラリの追加」をクリックし、必要なライブラリの名前を入力してください。
- 日本語訳 : Tora Marunouchi
- 英文 (翻訳したバージョン: 3)
- 日本語 NetBeans 開発者 FAQ へ戻る
