2008-10-13 4 views
10

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

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

Я выбрал accept the solution that actually best fits my situation. мое приложение - это хобби-проект, который все еще находится в стадии разработки эскиза, и настало время рассмотреть возможность вставки новых технологий. также, поскольку парень, который должен помочь мне с BL, является разработчиком JavaScript, идея использования интерпретатора JavaScript вместо компилятора-заглушки + classLoader кажется более привлекательной для меня в этой ситуации. другие (непринятые) ответы на этот вопрос являются информативными и, насколько я могу судить, очень хорошо отвечают на мой вопрос, поэтому спасибо, но я попытаюсь попробовать Rhino :)

ответ

4

Возможно, вы найдете что-то вроде носорога или groovy более полезно на практике.

+0

Хотя вы не получили технически ответа на мой вопрос, вы открыли для меня новую возможность, которая, на мой взгляд, будет более полезной на практике (хотя для этого потребуется больше обучения). (+ upvove) – 2008-10-14 11:29:52

+1

Возможно, я должен был быть более откровенен, что сам прошел один и тот же процесс размышлений. Я закончил тем, что использовал носорог, так как теперь он является частью JDK. Удачи – Draemon 2008-10-14 13:58:58

0

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

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

12

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

Быстрый google поднял this example usage.

+1

Спасибо за ссылку! Нашел этот пример, который очень хорошо работал для меня: http://www.javablogging.com/dynamic-in-memory-compilation/ – Peter 2012-08-27 13:34:03

6

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

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

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