Pregunta

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 que se ejecuta leería en un archivo de texto que contiene una lista de los miembros de la clase a incluir en la nueva clase. La aplicación entonces definir una definición de clase basado en la lista de miembros y, a continuación, insantiate él.

¿Fue útil?

Solución

Sí, es posible hacer lo que en teoría es el archivo de clase de código de bytes, que se encuentra al final de una matriz de bytes! a continuación, puede utilizar el método defineClass (String, byte [], int, int) para obtener una instancia de la clase que se puede utilizar para crear instancias de objetos a través de la reflexión.

En la práctica se puede usar algo como CGLIB o javaassist .

También puede utilizar el largo camino de generar el código de Java en un archivo, invocando el compilador, a continuación, cargar el archivo.

Otros consejos

Puede generar dinámicamente clases utilizando ASM

Puede hacer esto escribiendo el código para su nueva clase a un archivo, a continuación, invocar el compilador 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; se necesita el código, hace algunos cambios en él, lo envuelve en un bloque try / catch en medio de una clase, que entonces la incluye en el sistema de archivos, lo compila, y utiliza un cargador de clases para obtener y demandar a servir peticiones.

Claro que es posible. Véase, por ejemplo, este artículo .

Tal vez el más simple solución (en términos de que no requieren bibliotecas adicionales) sería utilizar el compilador de Java API que viene con Java 6. Sólo acaba de ser capaz de generar el .java, compilar y luego realizar una Class.forName () .

Tal vez un poco exagerado, la Apache BCEL (Byte Code Biblioteca de ingeniería) se puede utilizar para crear archivos class durante el tiempo de ejecución.

Aunque no he probado a mí mismo, concebiblemente, entonces uno podría crear una clase, cargar, y crear instancias de ella durante el tiempo de ejecución.

Sí, eso es posible.

Se pueden crear clases con Javassist en tiempo de ejecución definiendo el cuerpo de la clase y hacer javassist compilar su nueva clase.

Javassist tiene un compilador de código de bytes a medida que crea en base a la definición de la clase. Tiene algunas formas particulares de manejar las cosas, pero es muy fácil e intuitivo de usar esta biblioteca.

Javassist se utiliza en JBoss, y creo que es una buena referencia:)

El mismo se puede conseguir con BCEL , sin embargo, es mucho más difícil (pero de esta manera se tener más control sobre lo que está siendo generado).

Probablemente se podría hacer algo así con JRuby o JPython o maravilloso si es necesario.

Si te sientes particularmente masoquista usted podría mirar a BCEL .

Si desea Java y metaprogramming, usar maravilloso .

ASM es la biblioteca más bajo nivel de código de bytes para Java, supongo. Eso hace que sea muy difícil, pero también muy poderoso. Recomiendo la lectura de la documentación de ASM ( PDF ) para entender realmente cómo la generación de código de bytes en Java que funciona. Esa documentación también se explica cómo cargar el código de bytes en el cargador de clases (otro tema difícil hacerlo bien).

Después de que usted puede utilizar una de las bibliotecas de nivel superior, si se hace la vida más fácil, y entender lo que hacen. Para muchos casos, tales como proxies de generación, la CGLIB es útil y fácil de usar. Para obtener más poder, muchos han mencionado Javassist (no he t utilizó -. CGLIB y ASM han sido buenos para mí)

Hubo una pregunta reciente aquí con respecto a en memoria compilación que se debe dar algunas pistas sobre qué hacer después de que haya sido capaz de generar el código fuente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top