компиляция Java в памяти - PullRequest
       32

компиляция Java в памяти

10 голосов
/ 14 октября 2008

Как я могу сгенерировать байт-код (Byte []) из String во время выполнения, не используя процесс "javac" или что-то в этом роде? Есть ли простой способ вызова компилятора, как это?

позднее добавление:

Я решил принять решение, которое на самом деле лучше всего подходит моей ситуации . Мое приложение - это хобби-проект, который все еще находится на этапе разработки эскиза, и сейчас самое время подумать о внедрении новых технологий. Кроме того, поскольку парень, который должен помочь мне с BL, является разработчиком JavaScript, идея использования интерпретатора JavaScript вместо компилятора заглушки + classLoader мне кажется более привлекательной в этой ситуации. другие (непринятые) ответы на этот вопрос информативны и, насколько я могу судить, очень хорошо отвечают на мой вопрос, так что спасибо, но я собираюсь попробовать Rhino :)

Ответы [ 4 ]

12 голосов
/ 14 октября 2008

JDK6 имеет API компилятора Java . Однако, это не обязательно очень просто в использовании.

Быстрый Google подтянул этот пример использования .

6 голосов
/ 14 октября 2008

Я думаю, ваш лучший снимок будет Янино . Это позволит вам компилировать код во время выполнения и вызывать его из остальной части вашей программы. Мы используем его в некоторых наших системах для динамического обновления некоторых классов.

Это не бесплатно. Он работает хорошо, но использует пространство permgen каждый раз, когда вы загружаете новый класс (или версию класса), так что в конечном итоге вам не хватит памяти, если у вас есть (действительно) долго работающий процесс (или что-то, что загружает много новых классов) ) но вы можете изменить количество пространства permgen в JVM, чтобы убрать этот барьер, если это проблема.

Janino на самом деле является компилятором, но вы могли видеть, как он внедряет байт-код, если вам нужно работать на этом уровне. Возможно, вам придется в конечном итоге создать загрузчик классов или использовать API компилятора Java, как предложил Том Хоутин.

4 голосов
/ 14 октября 2008

На практике вы можете найти что-то вроде носорога или шпунта более полезным.

0 голосов
/ 14 октября 2008

Вы можете получить доступ к компилятору, пока файл tools.jar из вашего JDK находится в пути к классам. Документация для этого здесь . API не так прост, как eval() в некоторых интерпретируемых языках, но он есть.

Вам также может понадобиться какой-то странный код ClassLoader, чтобы запустить этот код, я не совсем уверен в этом.

...