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.
7 answers
Użyj Java 6 Compiler API .
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.
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
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.
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
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.
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ć.
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