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:
- run original program
- write modified version
- 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.
Question&Answers:
os