モジュール java.compiler
パッケージ javax.tools

インタフェースJavaCompiler

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

public interface JavaCompiler extends Tool, OptionChecker
プログラムからJavaプログラミング言語コンパイラを起動するインタフェースです。

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

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

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

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

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

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

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

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

  • コンパイラによるファイルの読み取りおよび書込みをカスタマイズするときに基本構築ブロックとして使用
  • 複数のコンパイル・タスク間で共有

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

File[] files1 = ... ; // input for first compilation task
File[] 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();
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) {
    @Override
    public void flush() throws IOException {
        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;
    }
}

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