Подтвердить что ты не робот

Сборка java in-memory

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

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

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

4b9b3361

Ответ 1

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

Ответ 3

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

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

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

Ответ 4

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

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