reservadas - ¿Cómo puedo compilar e implementar una clase java en tiempo de ejecución?
programacion en java pdf (7)
Podrías transformarlo en código Clojure, y el compilador Clojure lo convertirá en bytecode por ti.
Estoy en el proceso de escribir un motor de reglas que realiza asignaciones simples como lo determinan las construcciones condicionales. Es un requisito previo del proyecto que las reglas estén en formato XML. He modelado mi esquema XML para que se parezca a simples bloques de código. Deseo analizar el XML y luego transformarlo en código Java. Luego deseo compilar (y ejecutar) este código en tiempo de ejecución. Si lo hace, mi motor de reglas ya no actuará como intérprete, sino que ejecutará el código nativo de Java Byte.
He descubierto la etapa de análisis sintáctico y más o menos la fase de generación de código Java. Ahora me gustaría descubrir la última fase: la compilación en la fase de ejecución.
Siguiendo este hilo: compilar a bytecode java (sin usar Java) me he dado cuenta de las siguientes soluciones posibles:
Me encantaría una comparación de estos y otras sugerencias para resolver la compilación de Java en la fase de ejecución.
Use la API del compilador de Java 6 .
Groovy, BeanShell o cualquier otro lenguaje de scripting que se base en JVM tiene la capacidad de inyectar, modificar, agregar y ejecutar código en tiempo de ejecución. En realidad, se interpreta todo el lenguaje de scripting, por lo que en realidad no se están compilando en tiempo de ejecución.
puedes bifurcar un proceso como este
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
y puede compilarlo y ejecutarlo.
Javassist es casi un compilador completo de Java escrito en Java, y está completamente hecho de Java. No puede darle un archivo entero .java de una vez, pero puede darle la cadena de código para funciones individuales y agregarlas al mismo objeto CtClass, que se convierte en bytecode y luego en java.lang.Class.
Acabo de lanzar la versión 0.1 de GigaLineCompile, que usa Javassist (compilador) y Beanshell (intérprete) juntos y le da control sobre qué código optimizar y cuándo. En versiones posteriores, cambiará entre Javassist y Beanshell en una granularidad más pequeña, por lo que si tiene muchas cadenas de código que comparten algunas subcadenas, las subcadenas se compilarán y las otras partes se ejecutarán en beanshell. Es principalmente útil para la inteligencia artificial que genera código Java, pero también es una alternativa a Clojure o a los extremos de Javassist / Beanshell solo.
Javassist, Beanshell y GigaLineCompile se pueden descargar (con fuente) aquí: http://sourceforge.net/projects/gigalinecompile
aquí está la utilidad de compilación java, puede compilar su código en tiempo de ejecución sin ninguna herramienta de código de bytes
Ahórrese la molestia y use BeanShell como se menciona aquí Ejecutando código java en un archivo de texto .
¿Qué es BeanShell?
BeanShell es un intérprete de fuente de Java pequeño, gratuito e incrustable con funciones de lenguaje de escritura de objetos, escrito en Java. BeanShell ejecuta dinámicamente la sintaxis estándar de Java y la amplía con conveniencias comunes de creación de scripts, tales como tipos sueltos, comandos y cierres de métodos como los de Perl y JavaScript.
Puede utilizar BeanShell interactivamente para la experimentación y depuración de Java, así como para extender sus aplicaciones de nuevas maneras. Scripting Java se presta a una amplia variedad de aplicaciones que incluyen creación rápida de prototipos, extensión de scripts de usuario, motores de reglas, configuración, pruebas, implementación dinámica, sistemas integrados e incluso educación Java.
BeanShell es pequeño e integrable, por lo que puede llamar a BeanShell desde sus aplicaciones Java para ejecutar código Java dinámicamente en tiempo de ejecución o para proporcionar extensibilidad en sus aplicaciones. Alternativamente, puede usar scripts de BeanShell independientes para manipular aplicaciones Java; trabajando con objetos Java y API dinámicamente. Como BeanShell está escrito en Java y se ejecuta en la misma VM que su aplicación, puede pasar libremente las referencias a objetos "activos" en scripts y devolverlos como resultados.
En resumen, BeanShell se interpreta dinámicamente en Java, además de un lenguaje de scripting y un entorno flexible, todo en un paquete limpio.