DevFaqJavaModelBasicsJa

何か実用的なことをするために知っておくべきことは?

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


JavaModel を使って何かをするのは、迷路をさまようネズミのようなものだ。迷路にはたくさんのトンネルがあり、そのどこかに置かれているはずのチーズを探す。


そもそも JavaModel を使うということは、Javaのソース(数えきれないほどのインタフェースを実装したオブジェクトにラップされている)をあらわす抽象的なシンタックス・ツリーを操作することに他ならない。 いずれのインタフェースも問題の要素の「ある一面」を表していて、ほとんどのインタフェースには類似のオブジェクトを格納した java.util.List を返すメソッドが備わっている。これらのリストを調査して、出来る事・出来そう事を探すしかない。 こういう場合はジェネリックを使えると便利なのだが、今のところNetBeansのAPIではジェネリックは使えない。 System.out.println と Alt-Shift-O が、君のよき友となるだろう。


JavaModelを扱うためには、大量のインタフェースの海を泳ぐ必要がある。たとえば Method オブジェクトには、次のようなインタフェースが実装されている:CallableFeature、 BehavioralFeature、 TypedElement、 AnnotableElement、 Feature、 GenericElement、 ClassMember、 NamedElement 、それに Element。これらのインタフェースはJava言語のモデルを元に機械的に生成されたものなので、javadocには「参照の参照の値」のようなありがた~い説明しか記載されていない。


これはよろしくないということで、遠からずもう少しシンプルなAPIに置き換えられる予定になっている。そのAPIを使えば、パーサが生成する抽象的なシンタックス・ツリーをもっと直接的に操作できるようになるだろう( Tree API / JSR 199 )。


でもまぁ、大抵の場合は名前を見ればそのインタフェースに何が出来るかは見当がつくだろうから(ただし、かの有名な"MultipartId"は例外。MultipartIdはパッケージ識別子とクラス識別子から成り立ち、クラスの参照となるオブジェクトを参照する)、このAPIでもそれなりのスピードでコードを書くことはできる。そのうちに開発者としての勘が冴えてきて、トンネルのどこにチーズが置かれているか見つけ出せるようになるはずだ。


JavaModelを使うための、親切ではないが実用的なアドバイス: 本格的にJavaModelを使っていこうと考えているなら、 ソースをチェックアウト してこれらのクラスのコードを読み、インタフェースの迷路を制覇してみるといいかもしれない。一度は通る道だろう。コード補完機能は、対象のオブジェクトの使い方を知るのに非常に役立つ。ある呼び出しによりどんなタイプのオブジェクトを取得できるかを調べるには、おそらくオブジェクトが返すリストの中身を System.out.println するしかない(意味のある結果を得るためには、始めにリストをコピーする必要がある)。また、自分のキャスト処理が常に完璧だとは思わないこと。たとえばClassDefinitionは通常はJavaClassだが、壊れたソースファイル上ではUnresolvedClassになることもある。考えてみればもっともな話ではあるが、複雑な問題でもある。


NetBeansのソースには、以下のような比較的小さめのプロジェクトがいくつか含まれている。これらのJavaソースを研究すれば、基本的な扱い方を身につけることができるだろう:

  • refactoring
  • java/hints
  • contrib/codeInfo
  • java/navigation
  • contrib/importcruncher


いざとなれば、既に NetBeans の IDE に組み込まれている機能を参考にするという方法もある。その機能を実現するためには、探しているのと同じオブジェクトを操作する必要があるはずだ。その上で目的のアクションやクラスと似た名前のJavaモジュールのソースを検索し、Fund Usagesライブラリを使って仕様書を調べてみるといい。


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