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:
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.
You can either use the open-source HotSpot VM or the commercial JRebel IDE plugin to easily achieve your goal (view comparison table here).