その型は誰の持ち物?
「型の発見方法」で解説したITypeオブジェクトの取得方法だが,IJavaProject#findType()ではJavaプロジェクトのクラスパス全体から型を検索してしまう。つまり,ライブラリ(JARファイル)や,依存関係にある他プロジェクトのクラスがfindTypeメソッドの結果としてヒットしてしまうのである。あくまで対象のJavaプロジェクトで新規に作成された型のITypeオブジェクトを取得したいときにはどうしたら良いのだろうか?IJavaProjectオブジェクトからパッケージをたどってクラスを自分で見つけることもできなくもないが,せっかくあるIJavaProject#findType()を使って何とかしたい。
ITypeインタフェース(の親のIJavaElementインタフェース)に,getUnderlyingResourceメソッドがある。これは対象となるITypeオブジェクトを含んでいる最も根本的な(?)リソース(IResourceオブジェクト)を返してくれるメソッドである。このメソッドの結果を使うことによって,ITypeオブジェクトがどこに所属しているかを判断することができる。
例を見てみよう。
[Javaプロジェクト]
・プロジェクトA - projectA
・プロジェクトB - projectB
- 依存プロジェクト projectA
- 依存ライブラリ hoge.jar
というプロジェクト構成で,この中のいずれかにyoichiro.Testクラスが存在するとする。そして,
IJavaProject projectB = ...;
IType type = projectB.findType("yoichiro.Test");
IResource resource = type.getUnderlyingResource();
としてfindTypeメソッドの結果のITypeオブジェクトからgetUnderlyingResourceメソッドでIResourceオブジェクトを取得する。このresourceオブジェクトを以下のように判断することによって,存在場所を特定できる。
(1) resourceオブジェクトがnullだった場合
- 依存ライブラリに存在(例では依存ライブラリは1つなのでhoge.jar内)
(2) resource.getProject().equals(projectB.getProject()) == true の場合
- プロジェクトBに存在
(3) resource.getProject().equals(projectB.getProject()) == false の場合
- 依存プロジェクトに存在(例では依存プロジェクトは1つなのでプロジェクトA内)
IResourceクラスのgetProjectメソッドを使ってJavaプロジェクトの作成元のIProjectオブジェクトを取得し,ITypeオブジェクトから得たIProjectオブジェクトとIJavaProjectオブジェクトから得たIProjectオブジェクトが同一かどうかを判断している。上記の(1)と(2)を使えば,対象のプロジェクトで作成された型かどうかを判断することができる。
| 固定リンク
この記事へのコメントは終了しました。
コメント