DevFaqJavaModelJa

Revision as of 15:49, 6 November 2009 by Admin (Talk | contribs)
(diff) ← Older revision | Current revision (diff) | Newer revision → (diff)

JavaModel...MDR...Metamodel...RefObjects...MultipartIds...what is これ、いったい何ですか???

注意: この FAQ 項目は NetBeans 4.x および 5.x にのみ適用されます。NetBeans 6 では Java 解析の基盤が新しいAPIに置き換えられました。

NetBeans 上で Java のファイル類をプログラム的に操作するための基盤は、現在のところ、モデリング、およびモデル駆動アーキテクチャに基づく膨大な標準規格に基づいて構築されています(モデル駆動アーキテクチャに関する話は、"接頭辞のサラダ(訳者注:"言葉のサラダ"をもじった造語であると思われる)"状態に陥る傾向があります。その結果、 NetBeans の API にもこうした接頭辞サラダが一部紛れ込むことになりました)

これらの機能は、様々な言語に実装されているリファクタリング機構に似た処理基盤の上に成り立っています。 Java 用の API は実質上、「 Java 言語」を表現するメタモデルから機械的に生成されます(これはたとえば、パッケージと呼ばれるものがあり、その中にクラスがあり、クラスの中にメソッドやフィールドが存在する…というような事柄を明示するものです)。

このため、 Java のソースを操作する API を使用する際には、 Java ソース内の様々な要素の特性をあらわすインタフェースを山ほど実装したオブジェクトを扱う必要があります。要素にはたとえば次のようなものがあります:

Resource - 0 個以上の Java クラスを含む .java または .classファイル
  JavaClass - Java のクラス
    Features - メソッドやフィールドなど
      Statements、 StatementBlocks、 VariableAccesses、 MethodInvocations など

一般にオブジェクトは自身の子オブジェクトのリストを返すメソッドを備えていますが、中には Resource.getImports() のように、特定の型のオブジェクトを返すための特殊な getter メソッドを持つものもあります。なお、これらのリストに対する操作はソースコードにリアルタイムに反映されるため、取り扱いには注意が必要です。リストから何らかのオブジェクトを削除すると、それに対応する要素もソースコードから消滅してしまいます。

どのような処理を行う場合も(それがたとえメソッドオブジェクトの名前を問い合わせるような処理であっても)、リポジトリのトランザクションロック内で実行する必要があります。メタデータ・リポジトリ( MDR )とはクラス間の関連などを記録したデータベースを保持するもので、これはコード保管やりファクタリングなどの処理の利用されます。そのため、何かを更新する場合は、常に書き込みロックを取得した上で行うようにして下さい。以下に典型的なパターンを示します:

boolean writeOperation = true;
JavaModel.getJavaRepository().beginTrans(writeOperation);
// rollback は書き込みトランザクションにのみ適用可能
boolean rollback = writeOperation;
try {
  // 何らかの処理
  // ....
  // 全て成功 -> rollback を false にする
  rollback = false;
} finally {
  JavaModel.getJavaRepository().endTrans(rollback);
}

なお、トランザクションロックの取得にはややコストがかかるため、可能な限りの処理を単一のトランザクション内で行うようにすると良いでしょう。

何か実用的なことをするために知っておくべきことは? も参考にしてください。


Not logged in. Log in, Register

By use of this website, you agree to the NetBeans Policies and Terms of Use. © 2012, Oracle Corporation and/or its affiliates. Sponsored by Oracle logo