public interface JavaCompiler extends Tool, OptionChecker
コンパイラは、コンパイル中にエラーメッセージなどの診断情報を生成することがあります。診断リスナーが指定されている場合、診断情報はこのリスナーに提供されます。リスナーが指定されていない場合、診断情報は何らかの形式 (未指定) でフォーマットされ、デフォルトの出力に書き込まれます。このデフォルトの出力は、特に指定されていなければ System.err になります。診断リスナーが指定されていても、一部の診断情報が Diagnostic に適合しない場合があります。この場合、この診断情報はデフォルトの出力に書き込まれます。
コンパイラツールには、標準ファイルマネージャーが関連付けられています。このファイルマネージャーは、コンパイラツールのネイティブの (組み込み型の) ファイルマネージャーです。標準ファイルマネージャーを取得するには、getStandardFileManager を呼び出します。
コンパイラツールは、追加要件 (詳細は下記のメソッドを参照) が満たされている限りは、任意のファイルマネージャーで機能する必要があります。ファイルマネージャーが指定されなかった場合、コンパイラツールは、標準ファイルマネージャー (たとえば getStandardFileManager によって返されるファイルマネージャー) を使用します。
このインタフェースを実装するインスタンスは、『Java™ 言語仕様』に準拠していて、かつ『Java™ 仮想マシン仕様』に準拠したクラスファイルを生成する必要があります。これらの仕様のバージョンは、Tool インタフェースに定義されています。
さらに、このインタフェースのインスタンスのうち、SourceVersion.RELEASE_6 以上をサポートするものは、注釈処理もサポートする必要があります。
コンパイラは、診断リスナーとファイルマネージャーの 2 つのサービスに依存しています。このパッケージに含まれるほとんどのクラスおよびインタフェースはコンパイラ (およびツール一般) の API を定義していますが、DiagnosticListener、JavaFileManager、FileObject、および JavaFileObject の各インタフェースはアプリケーションで使用するためのものではありません。これらのインタフェースは、コンパイラ用のカスタムサービスを提供するために実装され、使用されます。したがって、コンパイラの SPI を定義します。
このパッケージには、SPI の実装を簡便化し、コンパイラの動作をカスタマイズするためのクラスおよびインタフェースが多数含まれています。
StandardJavaFileManager標準ファイルマネージャーには、次の 2 つの用途があります。
ファイルマネージャーを再利用することで、ファイルシステムのスキャンと jar ファイルの読み取りのオーバーヘッドが潜在的に削減される可能性があります。オーバーヘッドが削減されない場合でも、標準ファイルマネージャーは複数のコンパイルタスクを順次処理する必要があります。次の例のようなコーディングパターンをお勧めします。
Files[] files1 = ... ; // input for first compilation task
Files[] files2 = ... ; // input for second compilation task
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
Iterable<? extends JavaFileObject> compilationUnits1 =
fileManager.getJavaFileObjectsFromFiles(Arrays.asList(files1));
compiler.getTask(null, fileManager, null, null, null, compilationUnits1).call();
Iterable<? extends JavaFileObject> compilationUnits2 =
fileManager.getJavaFileObjects(files2); // use alternative method
// reuse the same file manager to allow caching of jar files
compiler.getTask(null, fileManager, null, null, null, compilationUnits2).call();
fileManager.close();
DiagnosticCollector
Iterable<? extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();
StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null);
compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits).call();
for (Diagnostic extends JavaFileObject> diagnostic : diagnostics.getDiagnostics())
System.out.format("Error on line %d in %s%n",
diagnostic.getLineNumber(),
diagnostic.getSource().toUri());
fileManager.close();
ForwardingJavaFileManager、ForwardingFileObject、および ForwardingJavaFileObject
final Logger logger = ...;
Iterable<? extends JavaFileObject> compilationUnits = ...;
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager stdFileManager = compiler.getStandardFileManager(null, null, null);
JavaFileManager fileManager = new ForwardingJavaFileManager(stdFileManager) {
public void flush() {
logger.entering(StandardJavaFileManager.class.getName(), "flush");
super.flush();
logger.exiting(StandardJavaFileManager.class.getName(), "flush");
}
};
compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
SimpleJavaFileObject
/**
* A file object used to represent source coming from a string.
*/
public class JavaSourceFromString extends SimpleJavaFileObject {
/**
* The source code of this "file".
*/
final String code;
/**
* Constructs a new JavaSourceFromString.
* @param name the name of the compilation unit represented by this file object
* @param code the source code for the compilation unit represented by this file object
*/
JavaSourceFromString(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),
Kind.SOURCE);
this.code = code;
}
@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {
return code;
}
}
DiagnosticListener, Diagnostic, JavaFileManager| 修飾子と型 | インタフェースと説明 |
|---|---|
static interface |
JavaCompiler.CompilationTask
コンパイルタスクの将来を表すインタフェースです。
|
| 修飾子と型 | メソッドと説明 |
|---|---|
StandardJavaFileManager |
getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
このツールの標準ファイルマネージャー実装の新しいインスタンスを取得します。
|
JavaCompiler.CompilationTask |
getTask(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits)
指定のコンポーネントおよび引数を持つコンパイルタスクの将来を作成します。
|
getSourceVersions, runisSupportedOptionJavaCompiler.CompilationTask getTask(Writer out, JavaFileManager fileManager, DiagnosticListener<? super JavaFileObject> diagnosticListener, Iterable<String> options, Iterable<String> classes, Iterable<? extends JavaFileObject> compilationUnits)
ファイルマネージャーが指定されている場合、StandardLocation に定義されているすべての場所を処理できなければなりません。
注釈処理は、compilationUnits パラメータで渡されたコンパイル対象のソースコードのコンパイルユニットと、classes パラメータで名前が渡されたクラスファイルの両方を処理できます。
out - コンパイラからの追加出力に使用する Writer。null の場合は System.err を使用fileManager - ファイルマネージャー。null の場合はコンパイラの標準ファイルマネージャーを使用diagnosticListener - 診断リスナー。null の場合、コンパイラのデフォルトのメソッドを使って診断情報を報告options - コンパイラオプション。null の場合、オプションは存在しないclasses - 注釈処理によって処理されるクラスの名前。null の場合、クラス名は存在しないcompilationUnits - コンパイル対象のコンパイルユニット。null の場合、コンパイルユニットは存在しないRuntimeException - ユーザー指定のコンポーネントで回復不可能なエラーが発生した場合。cause はユーザーコード内のエラー。IllegalArgumentException - ソースとは別の種類のコンパイルユニットが指定された場合StandardJavaFileManager getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
標準ファイルマネージャーは、flush または close の呼び出しのあとでアクセスされると、自動的に再起動します。標準ファイルマネージャーは、その他のツールから利用できなければいけません。
diagnosticListener - 致命的でない診断情報用の診断リスナー。null の場合、コンパイラのデフォルトのメソッドを使って診断情報を報告locale - 診断情報のフォーマット時に適用されるロケール。null の場合、デフォルトのロケールが適用される。charset - バイトのデコードに使用された文字セット。null の場合、プラットフォームのデフォルトの文字セットを使用 バグまたは機能を送信
詳細な API リファレンスおよび開発者ドキュメントについては、Java SE のドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.