Java. Библиотека профессионала, том 2. Расширенные средства программирования [Кей С. Хорстманн] (pdf) читать постранично, страница - 42

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

компилятора

Компилятор вызывается очень просто, как показано в приведенном ниже

примере кода. Получаемое в итоге нулевое значение переменной

resul t

указы­

вает на удачный исход компиляции.

JavaCornpiler cornpiler =
ToolProvider.getSysternJavaCompiler();
OutputStream outStream = . . . ;
OutputStream errStream = ... ;
int result
compiler.run(null, outStream, errStream,
"-sourcepath", "src", "Test.java");
Все выводимые данные и сообщения об ошибках компилятор направляет
в указанные потоки вывода. В качестве параметров метода
вать и пустое значение
вывода

System. out

и

run () можно указы­
null. В данном случае используются стандартные потоки
System. err. Первый параметр метода run () обозначает

поток ввода, но, поскольку никаких данных, вводимых с консоли, компилятор не

принимает, значение этого параметра всегда оставляется пустым

метод

(null). Сам же
run () наследуется из обобщенного интерфейса Tool, допускающего при­

менение инструментальных средств для чтения вводимых данных.

8.2.
Остальные параметры метода
ло бы передать утилите

j avac,

run ()

Прикладной интерфейс

API

для компилятора

являются аргументами, которые следова­

если бы этот метод вызывался из командной стро­

ки. Они могут обозначать как параметры командной строки, так и имена файлов.

8.2.2.

Запуск заданий на компиляцию

С помощью объекта типа

CompilationTask

можно получить еще больший

контроль над процессом компиляции. Это может быть удобно в том случае, если
требуется предоставить исходный код из символьной строки, зафиксировать
файлы классов в оперативной памяти или обработать сообщения или преду­
преждения об ошибках или неполадках.
Чтобы

получить

CompilationTask,

задание

на

компиляцию

в

необходимо получить сначала объект

виде

объекта

compiler,

типа

как было по­

казано в предыдущем разделе, а затем сделать следующий вызов:

JavaCompiler.CompilationTask task = compiler.getTask(
/!если указано значение null этого параметра,
// то используется поток вывода System.err:
errorWr i ter,
//если указано значение null этого параметра,
//то используется

стандартньШ диспетчер файлов:

fileManager,
// если указано значение null этого параметра,
// то используется поток вывода System.err:
diagnostics,
//если

конкретное

/!указано,

значение

он принимает

этого параметра

пустое

значение

не

null:

options,
//этот

параметр

//если

конкретное

//указано,

служит для
значение

он принимает

обработки аннотаций;
этого параметра не

пустое

значение

null:

classes,
sources);
Три последних параметра в приведенном выше вызове являются экземпляра­
ми типа IteraЫe. Например, последовательность параметров компиляции мо­
жет быть задана следующим образом:
IteraЫe

options = List.of ("-d", "bin");

В качестве параметра
пляров типа

sources указывается итератор типа IteraЫe
,JavaFileObj ect, представляющих исходные файлы. Если

экзем­
требу­

ется скомпилировать файлы, находящиеся на жестком диске, следует получить
стандартный диспетчер файлов в виде объекта типа
и вызвать его метод

StandardJavaFileManager

getJavaFileObjects ():

StandardJavaFileManager f ileManager =
compiler.getStandardFileManager(null, null, null);
IteraЬle sources =
fileManager.getJavaFileObjectsFromStrings(
List .of ( "Filel. java", "File2. java" 11;
JavaCompiler.CompilationTask task = compiler.getTask(
null, null, null, options, null, sources);

Глава

Написание сценариев. компиляция и обработка аннотаций

8 •

НА ЗАМЕТКУ! Параметр

classes служит лишь для обработки аннотаций. И в этом случае не­
task. processors (annotationProcessors) со списком
Processor. Характерный пример обработки аннотаций приведен в разделе 8.6.

обходимо также сделать вызов

объектов типа

Метод

ge t

Та s

k ()

возвращает объект задания, но пока еще не запуска­

ет процесс компиляции.

Класс

Compi 1 а t i onTas k

реализует

интерфейс

CallaЫe. Объект этого класса можно передать исполнителю типа

Execu torService

для параллельного исполнения или же сделать синхронный

вызов, как показано ниже.

Boolean success

=

task.call();

8.2.З. Фиксация диагностики
Для приема появляющихся сообщений об ошибках устанавливается приемник

диагностики, реализующий интерфейс

DiagnosticListener.

Всякий раз, когда

компилятор выдает предупреждение или сообщение об ошибке, этот приемник
получает объект типа
реализуется в классе

Diagnostic. В частности, интерфейс DiagnosticListener
DiagnosticCollector, где собираются все диагностические

данные для просмотра и анализа по завершении компиляции, как демонстриру­
ется в следующем примере кода:

DiagnosticCollector collector =
new DiagnosticCollector();
compiler.getTask(null, fileManager, collector, null,
null, sources) .call();
for (Diagnostic