Alterar um método em tempo de execução por meio de um mecanismo de troca a quente
Suponha que tenhamos um programa Java trivial que consiste em apenas uma classe:
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);
}
}
Depois de compilado e executado, a saída será esta:
Hoje é um bom dia com um número 0
Hoje é um bom dia com um número 1
Hoje é um bom dia com o número 2
Hoje é um bom dia com um número 3
...
Minha pergunta: existe (ou existe no horizonte) alguma maneira de trocarreplacable
método em tempo de execução? Algo como escrever outra versão doHelloWorld
com uma nova versão doreplacable
, compilando-a e depois a versão antiga em uma JVM já em execução?
Então, se eu escrever a nova versão assim:
private static void replacable(int i) {
System.out.println("Today is an even nicer day with a number " + i);
}
existe algo semelhante aTroca de código quente de Erlang onde eu posso fazer isso:
executar programa originalescrever versão modificadausando um programa de linha de comandos, conecte-se à execução da JVM e substitua o método existentepara que, durante o tempo de execução, isso aconteça:
Hoje é um bom dia com um número 15000
Hoje é um bom dia com o número 15001
Hoje é um dia ainda melhor com um número 15002
Hoje é um dia ainda melhor com um número 15003
...
Suponha que o programa acima seja autônomo, execute em um ambiente Java SE padrão, não há mais nada no caminho de classe; portanto, é quase um programa no estilo Hello world.
Nota: Eu sei que tecnologias como manipulação de bytecode (cglib),aspectJ, jRebel, JMX, existem muitos métodos em Java EE, etc., mas não são o que estou pensando. Pense em Erlang.