РуЛиб - онлайн библиотека > Хорстманн Кей > Java, Java Script > Java. Библиотека профессионала, том 2. Расширенные средства программирования > страница 42

Читаем онлайн «Java. Библиотека профессионала, том 2. Расширенные средства программирования» 42 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