public interface JavaCompiler extends Tool, OptionChecker
编译器可能在编译期间生成诊断(例如,错误消息)。 如果提供了诊断侦听器,则诊断将提供给侦听器。 如果没有提供监听器,该诊断将在未指定的格式来格式化并写入到默认输出,这是System.err
除非另有规定。 即使提供诊断侦听器,某些诊断可能不适用于Diagnostic
,并将被写入默认输出。
编译器工具有一个相关的标准文件管理器,它是工具(或内置)的本机文件管理器。 标准文件管理器可以通过致电getStandardFileManager获得。
只要符合以下方法中详细的任何其他要求,编译器工具就必须与任何文件管理器一起使用。 如果没有提供文件管理器,则编译器工具将使用标准文件管理器,例如由getStandardFileManager返回的文件管理器。
实现此接口的实例必须符合The Java™ Language Specification和生成的类文件符合The Java™ Virtual Machine Specification。 这些规范的版本中定义Tool接口。 此外,该接口的实例支持SourceVersion.RELEASE_6
或更高版本还必须支持annotation processing 。
编译器依赖于两个服务: diagnostic listener和file manager 。 虽然大多数的类和接口在这个包定义了用于编译器(和工具一般)接口的API DiagnosticListener , JavaFileManager , FileObject和JavaFileObject并不意在应用中使用。 相反,这些接口旨在实现并用于为编译器提供定制服务,从而为编译器定义SPI。
该包中有许多类和接口,旨在简化SPI的实现以自定义编译器的行为:
StandardJavaFileManager
标准文件管理器有两个目的:
重用文件管理器可能会减少扫描文件系统和读取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();
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() 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;
}
}
DiagnosticListener
, Diagnostic
, JavaFileManager
Modifier and Type | Interface and Description |
---|---|
static interface |
JavaCompiler.CompilationTask
代表编译任务的未来的接口。
|
Modifier and Type | Method and Description |
---|---|
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
- 编写器用于编译器的附加输出;
使用System.err
如果null
fileManager
- 文件管理器;
如果null
使用编译器的标准文件管理器
diagnosticListener
- 诊断听众;
如果null
使用编译器的默认方法来报告诊断
options
- 编译器选项,
null
表示没有选项
classes
- 通过注释处理
null
类的名称,
null
表示没有类名
compilationUnits
- 编译单元,
null
表示无编译单位
RuntimeException
- 如果在用户提供的组件中发生不可恢复的错误。
cause将是用户代码中的错误。
IllegalArgumentException
- 如果任何选项无效,或者如果任何一个给定的编译单位是
source
StandardJavaFileManager getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
标准文件管理器将在调用flush
或close
访问时自动重新打开。 标准文件管理器必须与其他工具一起使用。
diagnosticListener
- 用于非致命诊断的诊断侦听器;
如果null
使用编译器的默认方法来报告诊断
locale
- 格式化诊断时应用的区域设置;
null
是指default locale 。
charset
- 用于解码字节的字符集;
如果null
使用平台默认