Jak mogę skompilować i wdrożyć klasę java w czasie wykonywania?

Jestem w trakcie pisania silnika reguł, który wykonuje proste zadania określone przez konstrukcje warunkowe. Warunkiem wstępnym projektu jest, aby reguły były w formacie XML. Mam modelowane mój XML schema przypominać proste bloki kodu. Chcę przeanalizować XML, a następnie przekształcić go w kod Java. Następnie chcę skompilować (i uruchomić) ten kod w czasie wykonywania. Oznaczałoby to, że mój silnik reguł nie działa już jako interpreter, ale wykonuje natywny Bajt Javy Kod.

Rozgryzłem etap parsowania i mniej więcej fazę generowania kodu Java. Chciałbym teraz rozgryźć ostatnią fazę-kompilację w fazie runtime.

Podążając za tym wątkiem: Skompiluj do kodu bajtowego Javy (bez użycia Javy) poznałem następujące możliwe rozwiązania:

Chciałbym porównać te jak i inne propozycje do rozwiązywania kompilacji Javy w fazie runtime.

Author: Community, 2009-06-30

7 answers

 18
Author: cletus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 15:19:40

Możesz przekształcić go w kod Clojure, a kompilator Clojure zmieni go w kod bajtowy dla Ciebie.

 4
Author: kwatford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-30 15:21:07

Tutaj jest Java compilation utility, możesz skompilować swój kod w czasie wykonywania bez żadnego narzędzia bytecode

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

 4
Author: abstract,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-12 16:11:30

Groovy, BeanShell lub jakikolwiek inny język skryptowy, który jest oparty na JVM mają takie możliwości, aby wstrzykiwać, modyfikować, dodawać i uruchamiać kod w czasie wykonywania. W rzeczywistości wszystkie języki skryptowe są interpretowane, więc w rzeczywistości nie są one kompilowane w czasie wykonywania.

 2
Author: Silent Warrior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 06:09:07

Javassist jest prawie pełnym kompilatorem Javy napisanym w języku Java i jest w całości wykonany z Javy. Nie możesz dać całego .plik java na raz, ale można mu nadać ciąg kodu dla poszczególnych funkcji i dodać je do tego samego obiektu CtClass, który staje się bajtowym kodem, a następnie Javą.lang.Klasy.

Właśnie wydałem wersję 0.1 GigaLineCompile, która używa Javassist (kompilator) i BeanShell (interpreter) razem i daje Ci kontrolę nad tym, który Kod optymalizować i kiedy. W późniejszym czasie wersje, zmieni się pomiędzy Javassist i Beanshell przy mniejszej ziarnistości, więc jeśli masz wiele ciągów kodu, które dzielą niektóre podłańcuchy, podłańcuchy zostaną skompilowane, a inne części uruchomione w beanshell. Jest głównie przydatny dla sztucznej inteligencji, która generuje kod Javy, ale jest również alternatywą dla Clojure lub skrajności samego Javassist/Beanshell.

Javassist, Beanshell i GigaLineCompile można pobrać (ze źródłem) proszę.: http://sourceforge.net/projects/gigalinecompile

 2
Author: Ben F Rayfield,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-02 18:36:42

Oszczędź sobie kłopotów i użyj BeanShell, Jak wspomniano tutaj wykonując kod Javy podany w pliku tekstowym.

Czym jest BeanShell?

BeanShell to mały, darmowy, osadzalny Interpreter źródłowy Javy z obiektem funkcje języka skryptowego, napisane w Javie. BeanShell wykonuje standardową składnię Javy i rozszerza go o wspólne Skrypty wygody, takie jak luźne rodzaje, polecenia, a metody jak Ci w Perl i JavaScript.

Możesz używać BeanShell interaktywnie do eksperymentowania i debugowania w Javie jak również rozszerzyć swoje aplikacje w nowy sposób. Skrypty Java się do szerokiej gamy aplikacje, w tym rapid prototypowanie, rozszerzenie skryptów użytkownika, Zasady, konfiguracja, testowanie, dynamiczne wdrażanie, systemy wbudowane, a nawet edukacji Javy.

BeanShell jest mały i osadzalny, więc możesz wywołać BeanShell ze swojej Javy aplikacje do wykonywania kodu Java dynamicznie w czasie pracy lub w celu zapewnienia rozszerzalność w twoich aplikacjach. Alternatywnie możesz użyć samodzielnego Skrypty beansell do manipulowania Javą aplikacje; praca z Java obiekty i API dynamicznie. Od BeanShell jest napisany w Javie i działa w tej samej maszynie wirtualnej co aplikacja, możesz swobodnie przekazywać odniesienia do "żywe" obiekty do skryptów i zwracają ich wyniki.

W skrócie, BeanShell jest dynamicznie interpretowana Java, Plus skrypt język i elastyczne środowisko zwinięte w jedno czyste opakowanie.

 1
Author: Nick Holt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32

Możesz rozwidlić taki proces

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

I może go skompilować i uruchomić.

 1
Author: Rahul Garg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-01 07:18:09