Asumamos que tenemos un programa trivial Java que consta de una sola clase:Cambiar un método en tiempo de ejecución a través de un mecanismo de intercambio en caliente
public class HelloWorld {
private static void replacable(int i) {
System.out.println("Today is a nice day with a number " + i);
}
public static void main(String[] args) throws Exception {
for(int i = 0; i < 100000; ++i) {
replacable(i);
Thread.sleep(500);
}
}
Después de que se compila y ejecuta, la salida será la siguiente:
Hoy es un buen día con un número 0
Hoy es un buen día con un número 1
Hoy es un buen día con un número de 2
Hoy es un buen día con un número de 3
...
Mi pregunta: ¿existe (o hay en el horizonte) de alguna manera a intercambiar replacable
método en tiempo de ejecución? ¿Algo así como escribir otra versión de HelloWorld
con una nueva versión de replacable
, compilando y luego la versión anterior en una JVM ya en ejecución?
Por lo tanto, si escribo la nueva versión de esta manera:
private static void replacable(int i) {
System.out.println("Today is an even nicer day with a number " + i);
}
hay algo similar a Erlang's hot code swapping donde puedo hacer esto: programa original
- plazo
- versión modificada de escritura
- usando un programa de línea de comando, conéctese a JVM en ejecución y reemplace el método existente
de manera que, durante el tiempo de ejecución, esto sucederá:
Hoy es un buen día con un número 15000
Hoy es un buen día con un número 15001
Hoy en día es una aún mejor día con un número 15002
Hoy es un día aún más agradable con un número 15003
...
Supongamos que el programa anterior es independiente, se ejecuta en un entorno Java SE estándar, no hay nada más en classpath, por lo que es casi un programa Hello world style.
Nota: Sé que existen tecnologías como la manipulación de código de bytes (cglib), aspectJ, jRebel, JMX, hotswapping de métodos en Java EE, etc., pero no son lo que estoy pensando. Piensa en Erlang.
¿Puede explicar por qué no puede usar el Patrón de estrategia (por ejemplo, un objeto variable que implementa la funcionalidad variable requerida)? Los métodos de intercambio suenan complicados para lograr lo que desea. – ivy
@ivy: Podría usar eso, por supuesto, pero me pregunto si es posible hacer lo que describí en mi pregunta. Puede pensarlo como una pregunta "teórica" de alguna manera. – darioo
@ivy el mecanismo está ahí para actualizar un servicio en ejecución, no para seleccionar entre un conjunto de implementaciones conocidas. –