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, run
isSupportedOption
JavaCompiler.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.