モジュール java.compiler

パッケージjavax.lang.model


パッケージjavax.lang.model
「Java言語モデル」を構成するパッケージの型と階層。Javaプログラミング言語の宣言と型をモデル化する反射型APIです。 このパッケージのメンバーとサブパッケージは、言語のモデル化および言語処理のタスクとAPIに使用されます。これらには、注釈処理のフレームワークが含まれますが、それだけではありません。

この言語モデルは、ミラー・ベースの設計に従います。詳細については、次を参照してください。

Gilad Bracha、David Ungar著。 Mirrors: Design Principles for Meta-level Facilities of Object-Oriented Programming Languages』。 2004年10月ACM Conference on Object-Oriented Programming, Systems, Languages and Applicationsの議事録
特に、モデルは、java.util.Setを表すelementなどの宣言された言語構成メンバーと、raw型java.util.Set java.util.Set<String>およびjava.util.Set<T>などの要素と関連付けられるtypesのファミリとは区別します。

特に指定されないかぎり、このパッケージのメソッドはnull引数が渡されるとNullPointerExceptionをスローします。

要素およびタイプ

定義と用途

大まかに言えば、elementパッケージは要素の宣言(「定義」)をモデル化し、typeパッケージは型のusesをモデル化します。 一般に、個別に使用すると、定義に関連付けられた情報とは別に個別化された情報を持つことができます。 ある意味では、定義内の情報はすべての用途で共有されます。

たとえば、次の文字列処理メソッド identityOrEmpty java.lang.Stringを使用するとします。

// Return the argument if it is non-null and the empty string otherwise.
public static @DefinitelyNotNull String identityOrEmpty(@MightBeNull String argument) {
   ...
}
メソッドの戻り型は、@DefinitelyNotNull型の注釈が付いたStringで、パラメータの型は、 @MightBeNull型の注釈が付いたStringです。 リフレクティブAPIでは、注釈のセットは型として Stringの2つのusesで異なるため、これらの2つのケースを区別するために、戻り型と引数型を異なるオブジェクトで表す必要があります。 java.lang.String自体のdefinitionには、該当する型注釈のどちらも注釈が付けられません。

別の例として、1つの型パラメータを持つ汎用インタフェース(JLS 9.1.2) java.util.Setの宣言を考えてみます。 この宣言は、java.util.Set<String> java.util.Set<E>java.util.Set<?>、RAW型(JLS 4.8) java.util.Setなど、その宣言から導出された多数のパラメータ化された型(JLS 4.5)間の共通性をキャプチャします。

エレメントとタイプ間のマッピング

概念は異なりますが、要素と型の間には、定義と用途の間に双方向の(partial)マッピングがあります。 たとえば、大まかに言えば、型のすべての用途で不変になる情報は、型を定義する要素から取得できます。 たとえば、DeclaredType型ミラー・モデリングでjava.lang.Stringを使用するとします。 DeclaredType.asElement()をコールすると、 java.lang.StringTypeElementが返されます。 TypeElementから、namemodifiersなどの共通情報を取得できます。

すべての要素は、あるタイプで「マップ先」にできます。 クラスおよびインタフェースの要素は、「マップ先」「プロトタイプ」を取得します。 逆に、通常、多くの型が同じ「type要素」にマップできます。 たとえば、RAW型java.util.Setの型ミラー、プロトタイプ型java.util.Set<E>および型 java.util.Set<String>は、すべてjava.util.Setの型要素を「マップ先」します。 いくつかのタイプの型を要素にマップできますが、他のタイプの型には「要素マッピング」がありません。 たとえば、前述のように、「実行可能タイプ」の型ミラーには要素マッピングがありませんが、「宣言型」「type要素」にマップされます。

導入されたバージョン:
1.6
関連項目: