Часть III.
Компиляция Java средствами Java
Даниил Алиевский
В предыдущих частях статьи мы познакомились с технологией отражений (Java
Reflection). Это мощнейший механизм Java, позволяющий делать с .class-файлами
практически все что угодно – загружать из произвольных файлов, анализировать
набор членов класса, обращаться к этим членам, при необходимости обходя
стандартную защиту «private»/«protected». При желании можно даже подменить
стандартный механизм загрузки Java-классов и взять этот процесс под полный
контроль, например, разрешить перезагружать изменившиеся версии .class-файлов
без полной перезагрузки Java-машины (эта техника подробно рассматривалась в
части II, см. №1(2) журнала «Системный администратор»).
В этой части статьи мы научимся компилировать Java-код в .class-файлы.
Совместно с технологией отражений это позволит в процессе исполнения программы
«на лету» создавать новые классы в виде исходного текста, компилировать их,
загружать и использовать. Столь мощные возможности обычно присущи лишь чисто
интерпретируемым, сравнительно медленным языкам типа JavaScript или Perl или
Ассемблеру (точнее, машинному языку).
Всюду далее, если не оговорено обратное, мы будем
подразумевать последнюю (на момент написания статьи) версию Java фирмы Sun: Sun
Java SDK 1.4.
Как скомпилировать Java-файл с
исходным текстом
Решение, вообще говоря, совершенно банально – вызвать стандартный компилятор
javac!
На первый взгляд подобное решение кажется
неизящным, сопряженным с массой проблем. Например, компилятор придется
поставлять всем вашим пользователям. Другой пример – интеграция компилятора с
вашей системой: сообщения компилятора должны выдаваться не на системную
консоль, а «внутрь» вызывающей программы для обработки и визуализации в рамках
вашего пользовательского интерфейса.
Разработчики Java позаботились о том, чтобы эти
проблемы легко решались.