Programa que se automodifica en tiempo de ejecució
Publicado por Dani (6 intervenciones) el 05/03/2009 21:04:17
Hola!
Tengo el siguiente problema...que es un poco lioso de explicar.
1. Tengo dos clases
1.1 "ImprimeHola", que simplemente tiene un método("getTexto()") que lo que hace es println("hola"). Nada más
1.2 Otra, llamemosla "Principal", que se dedica a llamar a este método de forma iterada, de la siguiente forma (pseudocódigo):
________________________________________
ImprimeHola imprimeHola = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola.getTexto();
Thread.sleep(1000);
}
// * Aqui pasarán cosas luego. *
ImprimeHola imprimeHola2 = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola2.getTexto();
Thread.sleep(1000);
}
________________________________________
Lo cual produce la siguiente salida
hola
hola
hola
hola.
2. Entre medias de los dos for, ---y mientras se está ejecutando el programa--- se cambia el código de ImprimeHola.java, para que en vez de println("hola") tenga print("hola"), es decir, sin el salto de linea.
3. El nuevo código es compilado en tiempo de ejecución mediante
int compileReturncode=com.sun.tools.javac.Main.compile(textoConLosParametros);
Esto obtiene un nuevo ImprimeHola.class que se guarda en el sitio correspondiente, sobreescribiendo el aterior .class
Es decir, el código de antes queda así:
____________________________________________________________________
ImprimeHola imprimeHola = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola.getTexto();
Thread.sleep(1000);
}
// esta es la única diferencia con lo de antes
int compileReturncode=com.sun.tools.javac.Main.compile(textoConLosParametros);
//textConLosParametros tiene el directorio donde estan las clases, e ImprimeHola.java
ImprimeHola imprimeHola2 = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola2.getTexto();
Thread.sleep(1000);
}
____________________________________________________________________
Obteniendo, en teoría, la siguiente salida:
hola
hola
holahola
Cosa que no sucede... El nuevo .class veo que ha sido modificado, mediante fecha de modificación, pero no funciona.
¿Hay alguien que haya llegado hasta aqui? jajaja, madre, que largo...pero es que me parece complicadillo de explicar, espero haber transmitido la idea.
¿alguna sugerencia?
Estoy trabajando con programas que crean programas.
Muchas gracias de ante mano!
Un cordial saludo.
Dani.
Tengo el siguiente problema...que es un poco lioso de explicar.
1. Tengo dos clases
1.1 "ImprimeHola", que simplemente tiene un método("getTexto()") que lo que hace es println("hola"). Nada más
1.2 Otra, llamemosla "Principal", que se dedica a llamar a este método de forma iterada, de la siguiente forma (pseudocódigo):
________________________________________
ImprimeHola imprimeHola = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola.getTexto();
Thread.sleep(1000);
}
// * Aqui pasarán cosas luego. *
ImprimeHola imprimeHola2 = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola2.getTexto();
Thread.sleep(1000);
}
________________________________________
Lo cual produce la siguiente salida
hola
hola
hola
hola.
2. Entre medias de los dos for, ---y mientras se está ejecutando el programa--- se cambia el código de ImprimeHola.java, para que en vez de println("hola") tenga print("hola"), es decir, sin el salto de linea.
3. El nuevo código es compilado en tiempo de ejecución mediante
int compileReturncode=com.sun.tools.javac.Main.compile(textoConLosParametros);
Esto obtiene un nuevo ImprimeHola.class que se guarda en el sitio correspondiente, sobreescribiendo el aterior .class
Es decir, el código de antes queda así:
____________________________________________________________________
ImprimeHola imprimeHola = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola.getTexto();
Thread.sleep(1000);
}
// esta es la única diferencia con lo de antes
int compileReturncode=com.sun.tools.javac.Main.compile(textoConLosParametros);
//textConLosParametros tiene el directorio donde estan las clases, e ImprimeHola.java
ImprimeHola imprimeHola2 = new ImprimeHola();
for (int i=0;i<2;i++) {
imprimeHola2.getTexto();
Thread.sleep(1000);
}
____________________________________________________________________
Obteniendo, en teoría, la siguiente salida:
hola
hola
holahola
Cosa que no sucede... El nuevo .class veo que ha sido modificado, mediante fecha de modificación, pero no funciona.
¿Hay alguien que haya llegado hasta aqui? jajaja, madre, que largo...pero es que me parece complicadillo de explicar, espero haber transmitido la idea.
¿alguna sugerencia?
Estoy trabajando con programas que crean programas.
Muchas gracias de ante mano!
Un cordial saludo.
Dani.
Valora esta pregunta


0