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

Как я могу скомпилировать и развернуть класс java во время выполнения?

Я работаю над созданием механизма правил, который выполняет простые назначения, определенные условными конструкциями. Предварительным условием проекта является то, что правила должны быть в формате XML. Я смоделировал мою схему XML, чтобы похож на простые кодовые блоки. Я хочу проанализировать XML и затем преобразовать его в Java-код. Затем я хочу скомпилировать (и запустить) этот код во время выполнения. Это означает, что мой механизм правил больше не действует как интерпретатор, но выполняет собственный байт-код Java.

Я выяснил этап синтаксического анализа и более или менее фазу генерации кода Java. Теперь я хотел бы выяснить последнюю фазу - компиляцию на этапе выполнения.

Следуя этой теме: Компиляция с java-байт-кодом (без использования Java) Мне стало известно о следующих возможных решениях:

Мне бы хотелось сравнить их, а также другие предложения по решению компиляции Java на этапе выполнения.

4b9b3361

Ответ 2

Вы можете преобразовать его в код Clojure, а компилятор Clojure превратит его в байт-код для вас.

Ответ 3

здесь утилита java компиляции, вы можете скомпилировать свой код во время выполнения без инструмента для байт-кода

http://code.google.com/p/compilation-toolbox/

Ответ 4

Groovy, BeanShell или любой другой язык сценариев, основанный на JVM, имеет такое средство для ввода, изменения, добавления и запуска кода во время выполнения. Фактически весь язык сценариев интерпретируется, поэтому на самом деле они не компилируются во время выполнения.

Ответ 5

Javassist - это почти полный Java-компилятор, написанный на Java, и полностью выполненный из Java. Вы не можете дать ему целый .java файл сразу, но вы можете дать ему строку кода для отдельных функций и добавить их к одному и тому же объекту CtClass, который становится байт-кодом, а затем java.lang.Class.

Я только что выпустил версию 0.1 GigaLineCompile, которая использует Javassist (компилятор) и Beanshell (интерпретатор) вместе и дает вам контроль над тем, какой код нужно оптимизировать и когда. В более поздних версиях он будет меняться между Javassist и Beanshell с меньшей степенью детализации, поэтому, если у вас много строк кода, которые разделяют некоторые подстроки, подстроки будут скомпилированы, а остальные части будут работать в beanshell. Он в основном полезен для искусственного интеллекта, который генерирует Java-код, но также является альтернативой Clojure или экстремальным значениям Javassist/Beanshell.

Javassist, Beanshell и GigaLineCompile можно скачать (с исходным кодом) здесь: http://sourceforge.net/projects/gigalinecompile

Ответ 6

Спасите себя от проблем и используйте BeanShell, как указано здесь Выполнение кода Java в текстовом файле.

Что такое BeanShell?

BeanShell - небольшая, бесплатная, встраиваемая Исходный интерпретатор Java с объектом возможности написания сценариев, написанные в Java. BeanShell динамически выполняет стандартный синтаксис Java и расширяет его с помощью обычных скриптов удобства, такие как свободные типы, команд и закрытия методов, таких как в Perl и JavaScript.

Вы можете использовать BeanShell в интерактивном режиме для Java-экспериментов и отладки а также расширять ваши приложения по-новому. Скрипты Java предоставляют самой разнообразной приложений, включая быстрое прототипирование, расширение пользовательских скриптов, правил двигателей, конфигурации, тестирования, динамическое развертывание, встроенные системы, и даже Java-образование.

BeanShell маленький и вложимый, поэтому вы можете вызывать BeanShell с вашей Java приложения для выполнения Java-кода динамически во время выполнения или предоставлять расширяемость в ваших приложениях. Кроме того, вы можете использовать автономный Скрипты BeanShell для управления Java Приложения; работа с Java объектов и API динамически. поскольку BeanShell написан на Java и работает в той же виртуальной машине, что и ваше приложение, вы можете свободно передавать ссылки на "живые" объекты в скрипты и возвращать их как результаты.

Короче говоря, BeanShell динамически интерпретируемой Java, плюс сценарий языка и гибкой среды свернутый в один чистый пакет.

Ответ 7

вы можете развить такой процесс

Process p = Runtime.getRuntime().exec("java -classpath "..." SomeClassContainingMain ...other arguments);       

        //you need to consume the outputs of the command if output/error is large otherwise the process is going to hang if output/error buffer is full. and create a seperate thead for it (not created here).
        log.debug("PROCESS outputstream : " + p.getInputStream() );
        log.debug("PROCESS errorstream : " + p.getErrorStream());           
    p.waitFor(); // Wait till the process is finished

и может компилировать и запускать его.