2008-10-13 17 views
10

¿Cómo puedo generar bytecode (Byte []) desde una cadena en tiempo de ejecución, sin usar un proceso "javac" o algo por el estilo? ¿hay una forma simple de llamar al compilador de esa manera?compilación en memoria de Java

adición posterior:

me eligió accept the solution that actually best fits my situation. mi aplicación es un proyecto de hobby que aún se encuentra en fase de boceto de diseño, y es el momento adecuado para considerar la posibilidad de insertar nueva tecnología. Además, dado que el tipo que se supone que me ayuda con BL es un desarrollador de JavaScript, la idea de utilizar un intérprete de JavaScript en lugar de un compilador de compilación + classLoader me parece más atractiva en esta situación. otras respuestas (no aceptadas) de esta pregunta son informativas y, por lo que puedo decir, responden muy bien a mi pregunta, así que gracias, pero voy a intentar Rhino :)

Respuesta

4

Puede que encuentres algo como rinoceronte o maravilloso más útil en la práctica.

+0

Aunque técnicamente no respondiste mi pregunta, abriste una nueva posibilidad para mí, que creo que SERÁ más útil en la práctica (aunque requerirá más aprendizaje). ¡Gracias! (+ upvove) –

+1

Tal vez debería haber sido un poco más explícito que pasé por el mismo proceso de pensamiento. Terminé usando rinoceronte ya que ahora es parte del JDK. Buena suerte – Draemon

0

Puede acceder al compilador siempre que el archivo tools.jar de su JDK esté en classpath. La documentación para ello es here. La API no es tan simple como eval() en algunos idiomas interpretados, pero está ahí.

Es posible que también tenga que obtener un código raro de ClassLoader para ejecutar realmente ese código, no estoy totalmente seguro de eso.

12

JDK6 tiene un Java compiler API. Sin embargo, no es necesariamente muy fácil de usar.

Un rápido google detuvo this example usage.

+1

¡Gracias por el enlace! Encontré este ejemplo que funcionó muy bien para mí: http://www.javablogging.com/dynamic-in-memory-compilation/ – Peter

6

Creo que su mejor oportunidad va a ser Janino. Eso le permitirá compilar el código en tiempo de ejecución y llamarlo desde el resto de su programa. Lo usamos en algunos de nuestros sistemas para permitirnos actualizar dinámicamente algunas clases.

No es gratis. Funciona bien, pero usa espacio permgen cada vez que carga una nueva clase (o versión de una clase) por lo que se quedará sin memoria eventualmente si tiene un proceso (realmente) largo (o algo que carga muchas clases nuevas)) pero puede cambiar la cantidad de espacio permgen en la JVM para mover esa barrera bastante lejos si eso es un problema.

Janino es en realidad un compilador, pero se puede ver cómo se inyecta el bytecode si necesita operar en ese nivel. Es posible que deba terminar haciendo un cargador de clases o usar la API del compilador de Java como sugirió Tom Hawtin.

+0

He usado Janino para un proyecto. Tiene algunas limitaciones, pero funciona bien. Es LPGL por lo que sé ... –

+0

@Mario Ortegón: De acuerdo. Usamos una versión un poco más antigua que no admitía ninguna característica de Java 1.5, que fue un problema. Han mejorado eso, aunque todavía faltan algunas (como la sintaxis for (objeto: colección)). – MBCook