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
Последние комментарии
1 час 1 минута назад
10 часов 4 минут назад
1 день 9 часов назад
1 день 9 часов назад
1 день 9 часов назад
1 день 9 часов назад