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 の子です)

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 として扱うことができる)、ワークスペース内のすべてのプロジェクトの親と考えることができます。