public interface Filer
Writer
または OutputStream
上でclose
メソッドが呼び出されると、それ以降の処理ラウンドではこのツールによって処理対象とみなされます。 区別されるファイルは3種類あります。ソース・ファイル、クラス・ファイル、および補助リソース・ファイルです。
新しく作成されたファイルは、2つのサポートされた位置(論理ファイル・システム内のサブツリー)に配置されます。それぞれ、新しいソース・ファイル、新しいクラス・ファイルに使用されます。 これらの位置は、-s
や-d
などのフラグを使ってツールのコマンド行で指定されます。 実際の新しいソース・ファイルの場所と新しいクラス・ファイルの場所は、ツールの特定の実行で区別される場合もあれば、されない場合もあります。 リソース・ファイルはどちらかの位置で作成できます。 リソースの読書きを行うメソッドは、相対名の引数を取ります。 相対名は、一連のパス・セグメント(null以外、空以外)を「'/'
」で区切った形式の名前です。「'.'
」または「'..'
」は無効なパス・セグメントです。 有効な相対名は、RFC 3986のセクション 3.3の「path-rootless」規則に従う必要があります。
ファイル作成メソッドは可変個数の引数を取りますが、これは、依存関係の管理レベルを向上させるためのヒントとして、作成元要素をツール・インフラストラクチャに提供できるようにするためです。 元の要素は、注釈プロセッサに新しいファイルの作成を試みさせる( package-info
ファイルを表す)または( module-info
ファイルを表す)の型またはパッケージです。 たとえば、ある注釈プロセッサが、次のコードの処理結果として、ソース・ファイル GeneratedFromUserSource
を作成しようとしている場合、
次のように、作成メソッド呼出しの一部として@Generate public class UserSource {}
UserSource
の型要素が渡されるべきです。
作成元要素が存在しない場合は、何も渡す必要がありません。 この情報は、インクリメンタル環境で、プロセッサの再実行や生成されたファイルの削除の必要性を判断するために使用される可能性があります。 非インクリメンタル環境では、作成元要素の情報は無視されます。filer.createSourceFile("GeneratedFromUserSource", eltUtils.getTypeElement("UserSource"));
注釈処理ツールを実行するたびに、指定されたパス名を持つファイルが1回だけ作成されます。 このファイルをはじめて作成するときにファイルがすでに存在している場合、ファイルの古い内容は削除されます。 それ以降、その実行の間に同じファイルの作成が試みられるたびに、FilerException
がスローされます。同じ型名またはパッケージ名に対してクラス・ファイルとソース・ファイルの両方の作成が試みられた場合も同様です。 ツールへの初期入力は、0回目のラウンドで作成されたものであるとみなされます。したがって、これらの入力のいずれかに対応するソース・ファイルやクラス・ファイルの作成が試みられると、FilerException
がスローされます。
一般に、プロセッサは、何らかのプロセッサによって生成されたものではない既存ファイルを、故意に上書きしようとしてはいけません。 Filer
は、java.lang.Object
のような既存の型に対応するファイルを開く試みを、拒否する可能性があります。 同様に、注釈処理ツールの呼出し元は、生成されたものではない既存ファイルの上書きを検出されたプロセッサが試みるように、ツールを故意に構成してはいけません。
プロセッサは、ソースまたはクラス・ファイルが生成されることを示します。そのために、型がアクセス可能になるように環境が構成されている場合、Generated
注釈を組み込みます。
- APIのノート:
- ファイルの上書きの効果の一部は、decoratorスタイルのパターンを使用することによって達成できます。 あるクラスを直接変更する代わりに、そのクラスを適切に設計することで、注釈処理によってそのスーパー・クラスまたはサブクラスが生成されるようにします。 サブクラスが生成される場合、その親クラスは、publicコンストラクタではなくファクトリを使用するように設計できます。そうすれば、サブクラスのインスタンスのみが、親クラスのクライアントに対して提供されます。
- 導入されたバージョン:
- 1.6
-
メソッドのサマリー
修飾子と型 メソッド 説明 JavaFileObject
createClassFile(CharSequence name, Element... originatingElements)
新しいクラス・ファイルを作成し、それへの書込みを可能にするオブジェクトを返します。FileObject
createResource(JavaFileManager.Location location, CharSequence moduleAndPkg, CharSequence relativeName, Element... originatingElements)
書込み対象の新しい補助リソース・ファイルを作成し、それに対応するファイル・オブジェクトを返します。JavaFileObject
createSourceFile(CharSequence name, Element... originatingElements)
新しいソース・ファイルを作成し、それへの書込みを可能にするオブジェクトを返します。FileObject
getResource(JavaFileManager.Location location, CharSequence moduleAndPkg, CharSequence relativeName)
既存のリソースを読み取るためのオブジェクトを返します。
-
メソッドの詳細
-
createSourceFile
JavaFileObject createSourceFile(CharSequence name, Element... originatingElements) throws IOException新しいソース・ファイルを作成し、それへの書込みを可能にするオブジェクトを返します。 型またはパッケージのソース・ファイルを作成することができます。 ファイル名とパス(「ソース・ファイルのルート出力ロケーション」に関連して)は、ファイル(もしあれば)に指定されたモジュールと同様に、そのファイルで宣言されるアイテムの名前に基づいています。 1つのファイル(つまり、1つのコンパイル単位)で複数の型が宣言されている場合、ファイルの名前は主要なトップレベル型(パブリックなもの、例えば)の名前に対応する必要があります。ソース・ファイルは、パッケージ注釈など、パッケージに関する情報の格納用として作成することもできます。 名前付きパッケージのソース・ファイルを作成するには、
name
引数にパッケージ名を指定し、その後に".package-info"
を付けます。名前のないパッケージのソース・ファイルを作成するには、"package-info"
を使用します。オプションのモジュール名は、型名またはパッケージ名の前に付けられ、"
/
"文字を使用して区切られます。 たとえば、モジュールfoo
にa.B
型のソース・ファイルを作成するには、"foo/a.B"
の引数name
を使用します。明示的なモジュール・プレフィクスが与えられておらず、モジュールが環境でサポートされている場合は、適切なモジュールが推測されます。 適切なモジュールが推論できない場合は、
FilerException
がスローされます。 インプリメンテーションは、推論の一部として注釈処理ツールの構成に関する情報を使用することができます。名前付きモジュール内の名前のないパッケージにソース・ファイルを作成することはサポートされていません。
- APIのノート:
- 特定のcharsetを使用してファイルの内容をエンコードするには、返されたオブジェクトの
OutputStream
から、選択した文字セットを含むOutputStreamWriter
を作成できます。 返されたオブジェクトのWriter
を直接使用して書込みが行われる場合、その文字セットは実装によって決定されます。 注釈処理ツールには、これを指定するための-encoding
フラグやそれに類するものが用意されている可能性があります。それ以外の場合、それは通常、プラットフォームのデフォルト・エンコーディングになります。後続処理でのエラー発生を防ぐために、この実行で使用されているソース・バージョンに、ソース・ファイルの内容を準拠させるようにしてください。
- 実装上のノート:
- リファレンス実装では、注釈処理ツールが単一のモジュールMを処理している場合、Mが明示的なモジュール・プレフィクスなしで作成されたファイルのモジュールとして使用されます。 ツールが複数のモジュールを処理していて、
Elements.getPackageElement(package-of(name))
がパッケージを返す場合、返されたパッケージを所有するモジュールがターゲット・モジュールとして使用されます。 上記の規則を使用してターゲット・モジュールを決定できない場合は、別のオプションを使用してターゲット・モジュールを提供することができます。 - パラメータ:
name
- このファイル内で宣言される主体の型の正規の(完全指定)名。パッケージ情報ファイルの場合は、パッケージ名+".package-info"
originatingElements
- このファイルの作成に因果関係のある型、パッケージ、またはモジュール要素は、省略されるか、null
- 戻り値:
- 新しいソース・ファイルに書き込むための
JavaFileObject
- 例外:
FilerException
- 同じパス名がすでに作成されている場合は、同じ型がすでに作成されていますが、名前の作成はリクエストされたエンティティに対して有効ではありません。ターゲット・モジュールが判別できない場合、ターゲット・モジュールが書き込み可能でない場合、環境がモジュールをサポートしていない場合に指定されます。IOException
- ファイルを作成できない場合- Java言語仕様を参照してください:
-
7.3 コンパイル単位
-
createClassFile
JavaFileObject createClassFile(CharSequence name, Element... originatingElements) throws IOException新しいクラス・ファイルを作成し、それへの書込みを可能にするオブジェクトを返します。 型またはパッケージのクラス・ファイルを作成できます。 ファイル名とパス(「クラス・ファイルのルート出力ロケーション」に関連して)は、宣言されるアイテムの名前と、アイテム(もしあれば)の指定されたモジュールに基づいています。クラス・ファイルは、パッケージ注釈など、パッケージに関する情報の格納用として作成することもできます。 名前付きパッケージのクラス・ファイルを作成するには、
name
引数をパッケージ名にし、その後に".package-info"
を付けます。名前のないパッケージ用のクラス・ファイルの作成はサポートされていません。オプションのモジュール名は、型名またはパッケージ名の前に付けられ、"
/
"文字を使用して区切られます。 たとえば、モジュールfoo
に型a.B
のクラス・ファイルを作成するには、"foo/a.B"
の引数name
を使用します。明示的なモジュール・プレフィクスが与えられておらず、モジュールが環境でサポートされている場合は、適切なモジュールが推測されます。 適切なモジュールが推論できない場合は、
FilerException
がスローされます。 インプリメンテーションは、推論の一部として注釈処理ツールの構成に関する情報を使用することができます。名前付きモジュール内の名前のないパッケージにクラス・ファイルを作成することはサポートされていません。
- APIのノート:
- 後続処理でのエラー発生を防ぐために、この実行で使用されているソース・バージョンに、クラス・ファイルの内容を準拠させるようにしてください。
- 実装上のノート:
- リファレンス実装では、注釈処理ツールが単一のモジュールMを処理している場合、Mが明示的なモジュール・プレフィクスなしで作成されたファイルのモジュールとして使用されます。 ツールが複数のモジュールを処理していて、
Elements.getPackageElement(package-of(name))
がパッケージを返す場合、返されたパッケージを所有するモジュールがターゲット・モジュールとして使用されます。 上記の規則を使用してターゲット・モジュールを決定できない場合は、別のオプションを使用してターゲット・モジュールを提供することができます。 - パラメータ:
name
- 書き込む型のバイナリ名。パッケージ情報ファイルの場合は、パッケージ名+".package-info"
originatingElements
- このファイルの作成に因果関係のある型、パッケージ、またはモジュール要素は、省略されるか、null
- 戻り値:
- 新しいクラス・ファイルに書き込むための
JavaFileObject
- 例外:
FilerException
- 同じパス名がすでに作成されている場合は、同じ型がすでに作成されているか、型が有効でないか、ターゲット・モジュールが判別できない場合、ターゲット・モジュールが書き込み可能でない場合、または環境モジュールをサポートしていません。IOException
- ファイルを作成できない場合
-
createResource
FileObject createResource(JavaFileManager.Location location, CharSequence moduleAndPkg, CharSequence relativeName, Element... originatingElements) throws IOException書込み対象の新しい補助リソース・ファイルを作成し、それに対応するファイル・オブジェクトを返します。 このファイルは、新しく作成されたソース・ファイルやバイナリ・ファイルと一緒に格納することも、サポートされているほかの場所に格納することもできます。 場所CLASS_OUTPUT
とSOURCE_OUTPUT
がサポートされている必要があります。 リソースは、いくつかのモジュールおよび/またはパッケージ(ソース・ファイルとクラス・ファイル)に対して名前、および相対パス名によってそこからのものであってもよいです。 緩やかな意味で、新しいファイルの絶対パス名は、location
、moduleAndPkg
、およびrelativeName
の連結になります。moduleAndPkg
に"/
"文字が含まれている場合、"/
"文字の前のプレフィクスはモジュール名で、"/
"文字の後のサフィクスはパッケージ名です。 パッケージのサフィクスは空白の場合があります。moduleAndPkg
が"/
"文字が含まれていない場合は、全体の引数はパッケージ名として解釈されます。指定されたロケーションが「モジュール指向のロケーション」でも「複数のモジュールを含む出力ロケーション」でもなく、明示的なモジュール・プレフィクスが与えられている場合、
FilerException
がスローされます。指定されたロケーションがモジュール指向のロケーションか複数のモジュールを含む出力ロケーションのいずれかであり、明示的なモジュール・プレフィクスが与えられていない場合、適切なモジュールが推論されます。 適切なモジュールが推論できない場合は、
FilerException
がスローされます。 インプリメンテーションは、推論の一部として注釈処理ツールの構成に関する情報を使用することができます。ファイルのフルパス名が新しいソース・ファイルまたは新しいクラス・ファイルのフルパス名に対応する場合でも、このメソッドで作成されたファイルは注釈処理のために登録されません。
- 実装上のノート:
- リファレンス実装では、注釈処理ツールが単一のモジュールMを処理している場合、Mが明示的なモジュール・プレフィクスなしで作成されたファイルのモジュールとして使用されます。 ツールが複数のモジュールを処理していて、
Elements.getPackageElement(package-of(name))
がパッケージを返す場合、返されたパッケージを所有するモジュールがターゲット・モジュールとして使用されます。 上記の規則を使用してターゲット・モジュールを決定できない場合は、別のオプションを使用してターゲット・モジュールを提供することができます。 - パラメータ:
location
- 新しいファイルの位置moduleAndPkg
- ファイル名に関連するモジュールまたはパッケージ、または存在しない場合は空の文字列relativeName
- ファイルの最終パス名のコンポーネントoriginatingElements
- このファイルの作成に因果関係のある型、パッケージ、またはモジュール要素は、省略されるか、null
- 戻り値:
- 新しいリソースに書き込むための
FileObject
- 例外:
IOException
- ファイルを作成できない場合FilerException
- 同じパス名がすでに作成されている場合、ターゲット・モジュールを特定できない場合、またはターゲット・モジュールが書き込み可能でない場合、または明示的なターゲット・モジュールが指定されていてそのロケーションがサポートしていない場合。IllegalArgumentException
- サポートされていない場所の場合IllegalArgumentException
-moduleAndPkg
が不正な場合IllegalArgumentException
-relativeName
が相対名でない場合
-
getResource
FileObject getResource(JavaFileManager.Location location, CharSequence moduleAndPkg, CharSequence relativeName) throws IOException既存のリソースを読み取るためのオブジェクトを返します。 場所CLASS_OUTPUT
とSOURCE_OUTPUT
がサポートされている必要があります。moduleAndPkg
に"/
"文字が含まれている場合、"/
"文字の前のプレフィクスはモジュール名で、"/
"文字の後のサフィクスはパッケージ名です。 パッケージ・サフィクスは空でもかまいません。ただし、モジュール名が存在する場合、モジュール名は空でなければなりません。moduleAndPkg
が"/
"文字が含まれていない場合は、全体の引数はパッケージ名として解釈されます。指定されたロケーションが「モジュール指向のロケーション」でも「複数のモジュールを含む出力ロケーション」でもなく、明示的なモジュール・プレフィクスが与えられている場合、
FilerException
がスローされます。指定されたロケーションがモジュール指向のロケーションか複数のモジュールを含む出力ロケーションのいずれかであり、明示的なモジュール・プレフィクスが与えられていない場合、適切なモジュールが推論されます。 適切なモジュールが推論できない場合は、
FilerException
がスローされます。 インプリメンテーションは、推論の一部として注釈処理ツールの構成に関する情報を使用することができます。- 実装上のノート:
- リファレンス実装では、注釈処理ツールが単一のモジュールMを処理している場合、Mは明示的なモジュール・プレフィクスなしで読み取られたファイルのモジュールとして使用されます。 ツールが複数のモジュールを処理していて、
Elements.getPackageElement(package-of(name))
がパッケージを返す場合、返されたパッケージを所有するモジュールがソース・モジュールとして使用されます。 上記の規則を使用してターゲット・モジュールを決定できない場合は、別のオプションを使用してターゲット・モジュールを提供することができます。 - パラメータ:
location
- ファイルの位置moduleAndPkg
- ファイルを検索するモジュールまたはパッケージ、空の文字列がない場合は空の文字列relativeName
- ファイルの最終パス名のコンポーネント- 戻り値:
- ファイルを読み取るためのオブジェクト
- 例外:
FilerException
- 書き込みのために同じパス名がすでに開かれている場合、ソース・モジュールを特定できない場合、またはターゲット・モジュールが書き込み可能でない場合、または明示的なターゲット・モジュールが指定されていてそのロケーションがサポートしていない場合。IOException
- ファイルを開けない場合IllegalArgumentException
- サポートされていない場所の場合IllegalArgumentException
-moduleAndPkg
が不正な場合IllegalArgumentException
-relativeName
が相対名でない場合
-