2009-06-26 5 views

Respuesta

9

Haciendo caso omiso del mundo de la pena que podría estar causando a través del código de auto-modificación (!), Me parece que hay 3 opciones:

  1. utilizar el soporte compilador incorporado de Java 6 y escribir clases/recompilación/recarga
  2. utilizar la biblioteca de manipulación de BCEL código de bytes de Apache para escribir su clase directamente
  3. hacer uso del soporte de scripting incorporado de Java 6 (o utilizar Apache BSF) para escribir métodos en su lenguaje de script JVM de elección, y ejecutar estos

de los tres anteriores, mi elección inicial (en ausencia de requisitos) se ser para ta Eche un vistazo a la opción 3. Sospecho que es la forma menos dolorosa de comenzar. He usado todo lo anterior, lamentablemente no puedo publicar enlaces al código del cliente.

+0

En lugar de BCEL use objectweb ASM [http://asm.ow2.org/] – KitsuneYMG

1

Eso debería ser difícil de realizar. Pero puede crear nuevas clases en tiempo de ejecución y cargarlas con un cargador de clases personalizado. Si desea modificar el código nuevamente, debe volver a cargar la clase.

+0

que sería un buen método de fábrica. – akf

-2

siempre se puede simplemente utilizar un lenguaje dinámico ...

+0

Creo que esta pregunta fue publicada por aburrimiento, por lo que su respuesta podría no ser correcta. – IAdapter

+2

-1 porque la pregunta fue explícita sobre Java –

+0

¿Lenguaje Java o máquina virtual Java? Hay una gran diferencia entre los dos. – OOPMan

1

De BCEL:

el código de librería Ingeniería Byte tiene la intención de dar a los usuarios la posibilidad conveniente analizar, crear y manipular (binario) archivos de clase Java (los que terminan con .class). Las clases están representadas por objetos que contienen toda la información simbólica de la clase determinada: métodos, campos y instrucciones de código de bytes, en particular.

+0

Realmente no lo entendí Jeremy. ¿Estás hablando en el contexto actual? –

+1

BCEL hace una parte del trabajo: te ayuda a generar o manipular nuevas clases. Lo segundo es cargar las nuevas clases, que están incorporadas en Java: la reflexión-API. – Mnementh

1

que ver estas opciones para este fin:

  • generar el código fuente de Java y compilar con el javac externo o las herramientas de compilación interna (no recuerdo el nombre). Y como usted es responsable de la nomenclatura, solo incluya un número de versión en el nombre de la clase para evitar anomalías de carga de clase.
  • utilizar el construido en el soporte de motor JavaScript
  • Algunos escenarios pueden ser resueltos usando Proxys java

Editar: Una vez creado un programa Java 1.4 que se llevó a reglas de negocio a partir de una base de datos existente de la herencia, Java generado archivos (básicamente implementaciones de una interfaz Predicate) con un montón de println() de ellos y usó la línea de comando javac para compilarlos.

1

Puede escribir código (Java) que genere nuevas clases (código de bytes) en tiempo de ejecución utilizando una biblioteca como bcel. Eso no es lo mismo que el código de auto modificación. Sospecho que el código de auto-modificación no es algo que el JVM es compatible.

Para obtener un ejemplo de generación de código nuevo en tiempo de ejecución, eche un vistazo al código fuente de clojure.

0

Como estudiante de pregrado llegué a trabajar en el JikesRVM. Es una JVM implementada (principalmente) en Java. ¡En tiempo de ejecución se compilará JIT! Es una muy buena pieza de tecnología.