インタフェース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
関連 目:
  • メソッドの詳細

    • getTask

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

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

      注釈処理は、compilationUnitsパラメータで渡されたコンパイル対象のソース・コードのコンパイル・ユニットと、classesパラメータで名前が渡されたクラス・ファイルの両方を処理できます。

      パラメータ:
      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の 合、プラットフォー のデフォルトの文字セットを使用
      戻り値:
      標準ファイル・マネージャ