programacion - Definir una clase mientras se ejecuta una aplicación Java
programacion en java ejemplos (11)
Claro que es posible. Vea por ejemplo este article .
En Java, ¿es posible crear una definición de clase sobre la marcha mientras se ejecuta una aplicación y luego crear un objeto de esa clase?
Por ejemplo, una aplicación en ejecución leería un archivo de texto que contiene una lista de miembros de la clase para incluir en la nueva clase. La aplicación luego definiría una definición de clase basada en la lista de miembros y luego la aislaría.
Hubo una pregunta reciente aquí con respecto a la compilación en memoria que debería darle algunos consejos sobre qué hacer después de que haya logrado generar el código fuente.
Probablemente podrías hacer algo así con JRuby, JPython o Groovy si es necesario.
Si te sientes particularmente masoquista puedes mirar a BCEL .
Puede hacer esto escribiendo el código de su nueva clase en un archivo, invocando el compilador de Java en ese archivo y utilizando un cargador de clases para cargar dinámicamente esa clase en su aplicación en ejecución. Apache Tomcat hace esto por sus páginas JSP; toma el código, le hace algunos cambios, lo envuelve en un bloque try / catch en medio de una clase, que luego escribe en el sistema de archivos, lo compila, y usa un cargador de clases para obtener y demandarlo para atender las solicitudes.
Puedes generar clases dinámicamente usando ASM
Quizás la solución más simple (en términos de no requerir bibliotecas adicionales) sería utilizar la API del compilador Java que viene con Java 6. Simplemente, solo podrá generar el .java, compilar y luego realizar un Class.forName ().
Sí, es posible hacerlo, en teoría, su archivo de clase es un código de bytes, que al final es una matriz de bytes. luego puede usar el método defineClass (String, byte [], int, int) para obtener una instancia de Class que se puede usar para instanciar objetos a través de la reflexión.
En la práctica puedes usar algo como CGLib o javaassist .
También puede utilizar el largo camino para generar el código Java en un archivo, invocar el compilador y luego cargar el archivo.
Sí, eso es posible.
Puedes crear clases con javaassist en tiempo de ejecución definiendo el cuerpo de la clase y haciendo que javassist compile tu nueva clase.
Javassist tiene un compilador personalizado que crea un código de bytes basado en la definición de su clase. Tiene algunas formas particulares de manejar las cosas, pero es muy fácil e intuitivo utilizar esta biblioteca.
Javassist se usa en JBoss, y creo que es una buena referencia :)
Lo mismo se puede lograr con BCEL , sin embargo es mucho más difícil (pero de esta manera usted tiene más control sobre lo que se está generando).
Si quieres Java y metaprogramación, usa Groovy .
ASM es la biblioteca de bytes de nivel más bajo para Java, supongo. Eso lo hace muy difícil pero también muy poderoso. Recomiendo leer la documentación de ASM ( PDF ) para comprender realmente cómo funciona la generación de bytecode en Java. Esa documentación también explica cómo cargar el código de bytes en el cargador de clases (otro tema difícil de hacer correctamente).
Después de eso, puede usar una de las bibliotecas de nivel superior, si le facilita la vida y comprende lo que hacen. Para muchos casos, como la generación de proxies, el CGLib es útil y simple de usar. Para obtener más poder, muchos han mencionado a javaassist (no lo he usado, CGLIB y ASM han sido buenos para mí).
Tal vez un poco excesivo, el Apache BCEL (Byte Code Engineering Library) se puede utilizar para crear archivos de class
durante el tiempo de ejecución.
Aunque no lo he probado yo mismo, posiblemente, uno podría crear una clase, cargarla y crear una instancia durante el tiempo de ejecución.