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 existente

para 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.

questionAnswers(7)

yourAnswerToTheQuestion