Java モデル

Java モデルは、Java プログラムの作成、編集、およびビルドに関連付けられているオブジェクトをモデル化するクラスのセットです。 Java モデル・クラスは、org.eclipse.jdt.core パッケージで定義されています。これらのクラスは、リソースに対して Java 特有の振る舞いを実装し、 さらに Java リソースをモデル要素に分解します。 

Java 要素

パッケージ org.eclipse.jdt.core は、 Java プログラムを構成する要素をモデルとするクラスを定義しています。 JDT は、メモリー内オブジェクト・モデルを使用して、Java プログラムの構造を表します。この構造は、プロジェクトのクラスパスから派生します。 モデルは、階層構造になっています。 プログラムの要素は、子要素に分解することができます。

Java 要素の操作は、リソース・オブジェクトの操作と似ています。 Java 要素を操作するとき、実際には、 ある基本のモデル・オブジェクトへのハンドルを操作しています。 要素が実際にワークスペースに存在しているかどうかを判別するには、exists() プロトコルを使用する必要があります。  

下の表は、Java 要素の種類を要約したものです。

要素 説明
IJavaModel ワークスペースに対応したルートの Java 要素を表します。Java ネーチャーを持つすべてのプロジェクトの親です。 また、これは、Java ネーチャーがないプロジェクトへのアクセスを可能にします。
IJavaProject ワークスペース内の Java プロジェクトを表します。 (IJavaModel の子)
IPackageFragmentRoot パッケージ・フラグメントのセットを表し、そのフラグメントを、 フォルダー、JAR または Zip ファイルのいずれかである基本リソースにマップします。 (IJavaProject の子です)
IPackageFragment パッケージ全体に対応するワークスペースの一部、またはパッケージの一部を表します。 (IPackageFragmentRoot の子です)
ICompilationUnit Java ソース (.java) ファイルを表します。 (IPackageFragment の子)
IPackageDeclaration コンパイル単位内のパッケージ宣言を表します。 (ICompilationUnit の子です)
IImportContainer コンパイル単位内のパッケージのインポート宣言のコレクションを表します。 (ICompilationUnit の子です)
IImportDeclaration 1 つのパッケージのインポート宣言を表します。 (IImportContainer の子)
IType コンパイル単位内のソース・タイプ、またはクラス・ファイル内のバイナリー形式のいずれかを表します。
IField 型内部のフィールドを表します。 (IType の子です)
IMethod 型内部のメソッドまたはコンストラクターを表します。 (IType の子です)
IInitializer 型内部の静的イニシャライザーまたはインスタンスのイニシャライザーを表します。 (IType の子です)
IClassFile コンパイル済みの (バイナリーの) 型を表します。 (IPackageFragment の子です)
ITypeParameter 型パラメーターを表します。  (任意の Java 要素の子ではなく、 IType.getTypeParameter(String) または IMethod.getTypeParameter(String) を使用して取得します)
ILocalVariable メソッドまたはイニシャライザーのローカル変数を表します。  (任意の Java 要素の子ではなく、 ICodeAssist.codeSelect(int, int) を使用して取得します)

Java 要素はすべて、 IJavaElement インターフェースをサポートしています。

いくつかの要素は、パッケージ・ビューに表示されます。 これらの要素は、ナビゲートする前に開く必要があるため、 IOpenable インターフェースを実装します。 下の図に、これらの要素がパッケージ・ビューでどのように表示されるかを示します。

IOpenable インターフェースを実装する要素を示すパッケージ・ビュー

IOpenable を実装する Java 要素は、大部分が基本のリソース・ファイル内の情報から作成されます。 同一の要素はリソースの「ナビゲーター」ビューで総称的に表されます。 

IOpenable インターフェースを実装する要素を示すリソース・ナビゲーター

他の要素は、Java コンパイル単位を構成する項目に対応しています。 下の図は、Java コンパイル単位と、そのコンパイル単位内のソース要素を表示するコンテンツ・アウトライナーを示しています。

対応するソース要素の関係を示すエディターおよびコンテンツ・アウトライナー

これらの要素は対応するソース・コードを提供するため、 ISourceReference インターフェースを実装します。 (これらの要素はコンテンツ・アウトライナーで選択されているため、対応するソース・コードが Java エディターに表示されます。)

Java 要素およびリソース

Java 要素の多くは、ワークスペース内の汎用リソースに対応しています。 汎用リソースから Java 要素を作成するときは、クラス  JavaCore が最適な開始ポイントになります。 以下のコードのスニペットは、Java 要素を対応するリソースから取得する方法を示したものです。

    
private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        IJavaProject myJavaProject= JavaCore.create(myProject);
        if (myJavaProject == null)
            // the project is not configured for Java (has no Java nature)
            return;
            
        // get a package fragment or package fragment root
        IJavaElement myPackageFragment= JavaCore.create(myFolder);
        
        // get a .java (compilation unit), .class (class file), or
        // .jar (package fragment root)
        IJavaElement myJavaFile = JavaCore.create(myFile);
    }

Java 要素があると、JDT API を使用してモデルの横断および照会を行うことができます。 また、Java 要素に含まれている非 Java リソースを照会することもできます。  

         private void createJavaElementsFrom(IProject myProject, IFolder myFolder, IFile myFile) {
        ...
        // get the non Java resources contained in my project.
        Object[] nonJavaChildren = myJavaProject.getNonJavaResources();
        ...
            

Java プロジェクト

シンプルなプロジェクトから Java プロジェクトを作成する場合、JavaCore は、そのプロジェクトが Java ネーチャーを使用して構成されているかどうかを検査します。  JDT プラグインはプロジェクト・ネーチャーを使用して、プロジェクトが Java の振る舞いを持つことを指定します。  このネーチャー (org.eclipse.jdt.core.JavaCore#NATURE_ID) は、「新規 Java プロジェクト」ウィザードによってプロジェクトを作成する際に、プロジェクトに割り当てられます。  プロジェクトで Java ネーチャーが構成されていない場合に、プロジェクトの作成が要求されると、 JavaCore はヌルを戻します。

JavaCore は、Java クラスパス (ソース・コードとライブラリーを見つけ出すためのロケーション、および出力バイナリー (.class) ファイルを生成するためのロケーションを含む) を保守するためにも使用されます。

Java プロジェクトの固有の特性とは何でしょうか? Java プロジェクトは、クラスパスを「.classpath」ファイルに記録し、 Java インクリメンタル・プロジェクト・ビルダーをそのプロジェクトのビルド・スペックに追加します。 それ以外の点では、これらは通常のプロジェクトに過ぎず、プラグインにより他のネーチャー (および他のインクリメンタル・ビルダー) を使用して構成することができます。  独自の動作に加えて Java の動作も持つプロジェクトを構成するプラグインは通常、 NewJavaProjectWizardPage を使用して、 Java ネーチャーを独自のカスタム・ネーチャーや振る舞いのほか、プロジェクトにも割り当てます。

IJavaModel は、Java プロジェクト・ネーチャーを持つ (したがって IJavaProject として扱うことができる)、ワークスペース内のすべてのプロジェクトの親と考えることができます。