JavaTM Platform
Standard Ed. 6

javax.tools
インタフェース JavaCompiler

すべてのスーパーインタフェース:
OptionChecker, Tool

public interface JavaCompiler
extends Tool, OptionChecker

Java プログラムから Java™ プログラミング言語コンパイラを呼び出すインタフェースです。

コンパイラは、コンパイル中にエラーメッセージなどの診断情報を生成することがあります。診断リスナーが指定されている場合、診断情報はこのリスナーに提供されます。リスナーが指定されていない場合、診断情報はなんらかの形式 (未指定) でフォーマットされ、デフォルトの出力に書き込まれます。このデフォルトの出力は、特に指定されていなければ System.err になります。診断リスナーが指定されていても、一部の診断情報が Diagnostic に適合しない場合があります。この場合、この診断情報はデフォルトの出力に書き込まれます。

コンパイラツールには、標準ファイルマネージャーが関連付けられています。このファイルマネージャーは、コンパイラツールのネイティブの (組み込み型の) ファイルマネージャーです。標準ファイルマネージャーを取得するには、getStandardFileManager を呼び出します。

コンパイラツールは、追加要件 (詳細は下記のメソッドを参照) が満たされているかぎりは、任意のファイルマネージャーで機能する必要があります。ファイルマネージャーが指定されなかった場合、コンパイラツールは、標準ファイルマネージャー (たとえば getStandardFileManager によって返されるファイルマネージャー) を使用します。

このインタフェースを実装するインスタンスは、『Java 言語仕様』に準拠していて、かつ『Java 仮想マシン仕様』に準拠したクラスファイルを生成する必要があります。これらの仕様のバージョンは、Tool インタフェースに定義されています。 さらに、このインタフェースのインスタンスのうち、SourceVersion.RELEASE_6 以上をサポートするものは、注釈処理もサポートする必要があります。

コンパイラは、診断リスナーファイルマネージャーの 2 つのサービスに依存しています。このパッケージに含まれるほとんどのクラスおよびインタフェースはコンパイラ (およびツール一般) の API を定義していますが、DiagnosticListenerJavaFileManagerFileObject、および JavaFileObject の各インタフェースはアプリケーションで使用するためのものではありません。これらのインタフェースは、コンパイラ用のカスタムサービスを提供する目的で実装され、使用されます。したがって、コンパイラの SPI を定義します。

このパッケージには、SPI の実装を簡便化し、コンパイラの動作をカスタマイズするためのクラスおよびインタフェースが多数含まれています。

StandardJavaFileManager
このインタフェースを実装するすべてのコンパイラは、通常の ファイルを操作する標準ファイルマネージャーを提供します。StandardJavaFileManager インタフェースは、通常ファイルからファイルオブジェクトを作成する追加メソッドを定義します。

標準ファイルマネージャーには、次の 2 つの用途があります。

ファイルマネージャーを再利用することで、ファイルシステムのスキャンと jar ファイルの読み取りのオーバーヘッドが潜在的に削減される可能性があります。オーバーヘッドが削減されない場合でも、標準ファイルマネージャーは複数のコンパイルタスクを順次処理する必要があります。次の例のようなコーディングパターンをお勧めします。

Files[] files1 = ...; // 最初のコンパイルタスクの入力
Files[] files2 = ...; // 2 番目のコンパイルタスクの入力

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); // 代替メソッドを使用
// jar ファイルのキャッシュを有効にするため同じファイルマネージャーを再利用
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 diagnostic :diagnostics.getDiagnostics())
System.out.format("Error on line %d in %d%n",
diagnostic.getLineNumber()
diagnostic.getSource().toUri());

fileManager.close();
ForwardingJavaFileManagerForwardingFileObject、および ForwardingJavaFileObject
標準ファイルマネージャーの動作をオーバーライドする目的でサブクラス化を行うことはできません。これは、標準ファイルマネージャーがコンストラクタの呼び出しによって作成されたのではなく、コンパイラでメソッドを呼び出すことによって作成されたものだからです。サブクラス化の代わりに、転送 (または委譲) を使用する必要があります。これらのクラスを使用すると、ほとんどの呼び出しを簡単に指定のファイルマネージャーまたはファイルオブジェクトに転送できるだけでなく、ファイルマネージャーの動作をカスタマイズすることもできます。たとえば、JavaFileManager.flush() の呼び出しをすべてログに記録するには、次のようにします。
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
このクラスは、ファイルオブジェクトを作成する際、基本単位として使用できる基本ファイルオブジェクト実装を提供します。たとえば、文字列に格納されたソースコードを表すファイルオブジェクトを定義するには、次のようにします。
       /**
* 文字列に格納されたソースを表すために使用するファイルオブジェクト。
*/
public class JavaSourceFromString extends SimpleJavaFileObject {
           /**
* この「ファイル」のソースコード。
*/
final String code;

           /**
* 新しい JavaSourceFromString を構築。
* @param name はこのファイルオブジェクトで表されるコンパイルユニットの名前
* @param code はこのファイルオブジェクトで表されるコンパイルユニットのソースコード
*/
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;
           }
       }

導入されたバージョン:
1.6
関連項目:
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)
          指定のコンポーネントおよび引数を持つコンパイルタスクの将来を作成します。
 
インタフェース javax.tools.Tool から継承されたメソッド
getSourceVersions, run
 
インタフェース javax.tools.OptionChecker から継承されたメソッド
isSupportedOption
 

メソッドの詳細

getTask

JavaCompiler.CompilationTask getTask(Writer out,
                                     JavaFileManager fileManager,
                                     DiagnosticListener<? super JavaFileObject> diagnosticListener,
                                     Iterable<String> options,
                                     Iterable<String> classes,
                                     Iterable<? extends JavaFileObject> compilationUnits)
指定のコンポーネントおよび引数を持つコンパイルタスクの将来を作成します。コンパイルは、CompilationTask インタフェースに記述されているとおりに行われていない可能性があります。

ファイルマネージャーが指定されている場合、StandardLocation に定義されているすべての場所を処理できなければなりません。

パラメータ:
out - コンパイラからの追加出力に使用する Writer。null の場合は System.err を使用
fileManager - ファイルマネージャー。null の場合はコンパイラの標準ファイルマネージャーを使用
diagnosticListener - 診断リスナー。null の場合、コンパイラのデフォルトのメソッドを使って診断情報を報告
options - コンパイラオプション。null の場合、オプションは存在しない
classes - クラス名 (注釈処理用)。null の場合、クラス名は存在しない
compilationUnits - コンパイル対象のコンパイルユニット。null の場合、コンパイルユニットは存在しない
戻り値:
コンパイルを表すオブジェクト
例外:
RuntimeException - ユーザー指定のコンポーネント内で、回復不可能なエラーが発生した場合。 cause はユーザーコード内のエラー
IllegalArgumentException - ソースとは別の種類のコンパイルユニットが指定された場合

getStandardFileManager

StandardJavaFileManager getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener,
                                               Locale locale,
                                               Charset charset)
このツールの標準ファイルマネージャー実装の新しいインスタンスを取得します。ファイルマネージャーは、致命的ではない診断情報の生成に、指定の診断リスナーを使用します。致命的エラーが発生した場合、適切な例外によって通知されます。

標準ファイルマネージャーは、flush または close の呼び出しのあとでアクセスされると、自動的に再起動します。標準ファイルマネージャーは、その他のツールから利用できなければなりません。

パラメータ:
diagnosticListener - 致命的でない診断情報用の診断リスナー。null の場合、コンパイラのデフォルトのメソッドを使って診断情報を報告
locale - 診断情報のフォーマット時に適用されるロケール。null の場合、デフォルトのロケールが適用される
charset - バイトのデコードに使用された文字セット。null の場合、プラットフォームのデフォルトの文字セットを使用
戻り値:
標準ファイルマネージャー

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。