darioo darioo - 12 days ago 7
Java Question

Change a method at runtime via a hot swap mechanism

Assume we have a trivial Java program that consists of just one class:

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);
}
}


After it's compiled and run, output will be this:


Today is a nice day with a number 0

Today is a nice day with a number 1

Today is a nice day with a number 2

Today is a nice day with a number 3

...


My question: does there exist (or is there on the horizon) some way to swap
replacable
method at runtime? Something like writing another version of
HelloWorld
with a new version of
replacable
, compiling it and then the old version in an already running JVM?

So, if I write the new version like this:

private static void replacable(int i) {
System.out.println("Today is an even nicer day with a number " + i);
}


is there something similar to Erlang's hot code swapping where I can do this:


  1. run original program

  2. write modified version

  3. using a command line program, connect to running JVM and replace existing method



so that, during runtime, this will happen:


Today is a nice day with a number 15000

Today is a nice day with a number 15001

Today is an even nicer day with a number 15002

Today is an even nicer day with a number 15003

...


Assume that above program is standalone, runs in a standard Java SE environment, there is nothing else on classpath, so it's almost a Hello world style program.

Note: I know that technologies like bytecode manipulation (cglib), aspectJ, jRebel, JMX, hotswapping of methods in Java EE etc. exist, but they aren't what I'm thinking of. Think of Erlang.

Answer

You can either use the open-source HotSpot VM or the commercial JRebel IDE plugin to easily achieve your goal.

Features

  1. Change Method Body
  2. Add Method
  3. Remove Method
  4. Add Field
  5. Remove Field
  6. Add Supertype
  7. Remove Supertype