public interface JavaCompiler extends Tool, OptionChecker
Компилятор мог бы генерировать диагностику во время компиляции (например, сообщения об ошибках). Если диагностическому слушателю предоставят, то диагностика будет предоставлена слушателю. Если никакому слушателю не предоставят, то диагностика будет отформатирована в неуказанном формате и записана выводу значения по умолчанию, который является System.err
если иначе не определено. Даже если диагностический слушатель предоставляется, немного диагностики не могло бы поместиться в a Diagnostic
и будет записан выводу значения по умолчанию.
У инструмента компилятора есть связанный стандартный файловый менеджер, который является файловым менеджером, который является собственным к инструменту (или встроенным). Стандартный файловый менеджер может быть получен, вызывая getStandardFileManager.
Инструмент компилятора должен функционировать с любым файловым менеджером, пока любые дополнительные требования как детализировано в методах ниже удовлетворяются. Если никакой файловый менеджер не будет обеспечен, то инструмент компилятора будет использовать стандартный файловый менеджер, такой как тот, возвращенный getStandardFileManager.
Экземпляр, реализовывая этот интерфейс должен соответствовать Спецификации языка Java™ и генерировать файлы class, соответствующие Спецификации Виртуальной машины Java™. Версии этих спецификаций определяются в интерфейсе Инструмента. Дополнительно, экземпляр этой поддержки интерфейса SourceVersion.RELEASE_6
или выше должен также поддерживать обработку аннотации.
Компилятор полагается на две службы: диагностический слушатель и файловый менеджер. Хотя большинство классов и интерфейсов в этом пакете определяют API для компиляторов (и инструменты вообще) интерфейсы DiagnosticListener, JavaFileManager, FileObject, и JavaFileObject не предназначаются, чтобы использоваться в приложениях. Вместо этого эти интерфейсы предназначаются, чтобы быть реализованными и использоваться, чтобы предоставить настроенные услуги для компилятора, и таким образом определяет SPI для компиляторов.
Есть много классов и интерфейсов в этом пакете, которые разрабатываются, чтобы ослабить реализацию SPI, чтобы настроить поведение компилятора:
StandardJavaFileManager
Стандартный файловый менеджер служит двум целям:
Многократное использование файлового менеджера может потенциально уменьшить издержки сканирования файловой системы и чтения файлов фляги. Хотя не могло бы быть никакого сокращения издержек, стандартный файловый менеджер должен работать с многократными последовательными компиляциями, делающими следующий пример рекомендуемый образец кодирования:
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
Модификатор и Тип | Интерфейс и Описание |
---|---|
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
параметр, так же как файлы class, имена которых передают с classes
параметр.
out
- Писатель для дополнительного вывода от компилятора; использовать System.err
если null
fileManager
- файловый менеджер; если null
используйте стандарт компилятора filemanagerdiagnosticListener
- диагностический слушатель; если null
используйте метод значения по умолчанию компилятора для того, чтобы сообщить о диагностикеoptions
- опции компилятора, null
средства никакие опцииclasses
- имена классов, которые будут обработаны обработкой аннотации, null
средства никакие имена classcompilationUnits
- единицы компиляции, чтобы скомпилировать, null
средства никакие единицы компиляцииRuntimeException
- если неисправимая ошибка произошла в пользователе предоставленный компонент. Причиной будет ошибка в пользовательском коде.IllegalArgumentException
- если какая-либо из данных единиц компиляции является другим видом чем источникStandardJavaFileManager getStandardFileManager(DiagnosticListener<? super JavaFileObject> diagnosticListener, Locale locale, Charset charset)
Стандартный файловый менеджер будет автоматически вновь открыт, если к нему получат доступ после звонков flush
или close
. Стандартный файловый менеджер должен быть применимым с другими инструментами.
diagnosticListener
- диагностический слушатель для нефатальной диагностики; если null
используйте метод значения по умолчанию компилятора для того, чтобы сообщить о диагностикеlocale
- локаль, чтобы применяться, форматируя диагностику; null
означает локаль значения по умолчанию.charset
- набор символов используется для того, чтобы декодировать байты; если null
используйте значение по умолчанию платформы
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92