- 追加された行はこの色です。
- 削除された行はこの色です。
// 下階層用テンプレート
#topicpath
----
//ここにコンテンツを記述します。
#contents
[[Eclipse/プラグイン開発のTIPS集/ソースコードを解析するパーサASTParser]]でもちょっとやりましたが、パッケージ・エクスプローラからSelection経由でICompilationUnit((Javaのソースとかですね))を取得することができました。その
Javaソースは、何とかっていうJavaプロジェクトに属しているわけですが、Javaプロジェクト自体を操作するインタフェースもEclipseに用意されています。Javaプロジェクトを作成したり、削除したり、ソースを生成したりすることができるわけですね。以下にJavaプロジェクトを操作する方法をまとめておきます。
Javaソースは、何とかっていう名前のJavaプロジェクトに属しているわけですが、Javaプロジェクト自体を操作するインタフェースもEclipseに用意されています。Javaプロジェクトを作成したり、削除したり、ソースを生成したりすることができるわけですね。以下にJavaプロジェクトを操作する方法をまとめておきます。
パッケージ・エクスプローラを見てもわかるとおり、Javaプロジェクトはツリー構造になってるわけで、よくあるコンポジットなパタンになってます。このコンポジットたち全部が拡張しているインタフェースが[[org.eclipse.jdt.core.IJavaElement>http://publib.boulder.ibm.com/infocenter/radhelp/v6r0m1/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaElement.html]]です。
パッケージ・エクスプローラを見てもわかるとおり、Javaプロジェクトはツリー構造になってるわけで、よくあるコンポジットパタンになってます。コンポジットな要素たち全部が拡張しているルートのインタフェースが[[org.eclipse.jdt.core.IJavaElement>http://publib.boulder.ibm.com/infocenter/radhelp/v6r0m1/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaElement.html]]です。
**org.eclipse.jdt.core.IJavaElement [#ge8dcc8a]
全ての要素が拡張しているインタフェースですね。定数を見るとわかるのですが、コンポジットは
全ての要素が拡張しているインタフェースですね。定数を見るとわかるのですが、要素は
int JAVA_MODEL = 1;
int JAVA_PROJECT = 2;
int PACKAGE_FRAGMENT_ROOT = 3;
int PACKAGE_FRAGMENT = 4;
int COMPILATION_UNIT = 5;
int CLASS_FILE = 6;
int TYPE = 7;
int FIELD = 8;
int METHOD = 9;
int INITIALIZER = 10;
int PACKAGE_DECLARATION = 11;
int IMPORT_CONTAINER = 12;
int IMPORT_DECLARATION = 13;
int LOCAL_VARIABLE = 14;
int TYPE_PARAMETER = 15;
くらい種類があるようです。
**org.eclipse.jdt.core.IJavaModel [#w8ab5b31]
ワークスペース内のJava要素のルートですね。IJavaElement#getJavaModel()で取得することができます。
**[[org.eclipse.jdt.core.IJavaModel>http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaModel.html]] [#w8ab5b31]
ワークスペース内のJavaモデル(?)のルートです。IJavaElement#getJavaModel()で取得することができます。んがいまいちパッケージ・エクスプローラ上の概念でどこを指してるのかわからないですね。ただ
IJavaProject[] getJavaProjects();
IJavaProject getJavaProject(String name);
IWorkspace getWorkspace();
などのメソッドを持っているようです。
**org.eclipse.jdt.core.IJavaProject [#m6444966]
Javaプロジェクトです。 IJavaElement#getJavaProject() で取得することができます。よってコンポジットのどの要素からもJavaプロジェクトへの参照は得られるわけです。
**[[org.eclipse.jdt.core.IJavaProject>http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaProject.html]] [#m6444966]
Javaプロジェクトです。 IJavaElement#getJavaProject() で取得することができます。よってコンポジットのどの要素からもJavaプロジェクトへの参照が得られるわけです。
**org.eclipse.jdt.core.IPackageFragmentRoot [#cf42b3a1]
Javaプロジェクト内のパッケージ階層のトップ要素です。たとえば
**[[org.eclipse.jdt.core.IPackageFragmentRoot>http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IPackageFragmentRoot.html]] [#cf42b3a1]
Javaプロジェクト内のパッケージ階層のトップ要素です。ソースディレクトリやjarファイルなどに対応します。
たとえば
IPackageFragmentRoot root = null;
try {
IJavaProject javaProject = element.getJavaProject();
IPackageFragmentRoot[] roots = javaProject
.getPackageFragmentRoots();
for (IPackageFragmentRoot rootTmp : roots) {
if (rootTmp.getKind() == IPackageFragmentRoot.K_SOURCE) {
root = rootTmp; ↑ソースディレクトリだったら
}
}
} catch (JavaModelException e) {
e.printStackTrace();
}
などとしてソースディレクトリを取得することができます。
***他にもいろいろ確認してみた [#l04367c0]
他にも以下のやり方でソースディレクトリが取得できそうです。他にもいろいろメソッドを実行して試してみました。
#ref(ICompilationUnit.png)
上のようなディレクトリ構成で、いろいろなメソッドを実行しました。
System.out.println("Path: " + element.getPath());
System.out.println("Parent: " + element.getParent().getPath());
System.out.println("PrimaryElement: "
+ element.getPrimaryElement().getPath());
System.out.println("Primary: " + element.getPrimary().getPath());
IJavaElement ancestor = element
.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
System.out.println("Ancestor: " + ancestor.getPath());
elementはキャプチャ内のBL.javaを指しているICompilationUnitのインスタンスです。
実行結果は以下の通り:
Path: /HogeProject/src/nu/mine/kino/BL.java
Parent: /HogeProject/src/nu/mine/kino
PrimaryElement: /HogeProject/src/nu/mine/kino/BL.java
Primary: /HogeProject/src/nu/mine/kino/BL.java
Ancestor: /HogeProject/src
IJavaElement#getAncestor(int ancestorType) メソッドで、要素の型(JAVA_PROJECTとかPACKAGE_FRAGMENT_ROOTとか)を指定して上位ディレクトリのIJavaElementを取得することができます。上の例では
IJavaElement ancestor = element.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
として、BL.javaが入っているディレクトリのトップ階層つまりsrcディレクトリへの参照を取得しています。((test/hogehogeをソースディレクトリとしてたら、testでなくてtest/hogehogeのへの参照が得られました))
他のメソッドについてですが IJavaElement#getParent() については真上のディレクトリですね。他のヤツは、、んー全部BL.javaなんですよね。一応、[[JavaDocへのリンク>http://publib.boulder.ibm.com/infocenter/radhelp/v6r0m1/index.jsp?topic=/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaElement.html]]を載せておきます。。
**org.eclipse.jdt.core.IPackageFragment[#mfd3abc7]
**org.eclipse.jdt.core.ICompilationUnit [#r9ed8ac6]
----
この記事は
#vote(おもしろかった,そうでもない)
#comment
#topicpath
SIZE(10){現在のアクセス:&counter;}