Re: ClassLoader not loading recompiled classes
Aryeh M. Friedman wrote:
On Oct 2, 7:56 am, Silvio Bierman <sbier...@jambo-software.com> wrote:
Aryeh M. Friedman wrote:
On Oct 2, 6:02 am, Daniel Pitts <googlegrou...@coloraura.com> wrote:
Right, a ClassLoader will not re-load a class. You will have to
instantiate a new class loader to do so.
ClassLoader.loadClass will first look for already loaded classes. It
will not re-load the class into the JVM.
Its generally difficult to get dynamic class behavior from Java. You
aren't able to unload a class, and load a different version of it.
Also, and already loaded classes that refer to that other class will
only be able to refer to one instance of it, not one from one class
loader, and then another from another class loader.
Since I am relativally naive with class loaders how do I create a new
instance of the system class loader?
You don't. You can write your own class loaders if you want and can
implement any loading behavior you think is suitable.
I wrote a gui based unit testing framework and it loads the top level
test suites from a text box with there names in it (initially
populated from command line)... I do not want to have to close/reopen
the app when I rewrite/recompile some code under test.
Try look at the super simple example attached below.
Arne
=============================================
import java.io.*;
import java.net.*;
public class DoubleDynmaic {
private static void dynno(int n) {
(new File("test")).mkdir();
try {
OutputStream os = new FileOutputStream("test/Test.java");
PrintStream ps = new PrintStream(os);
ps.println("public class Test {");
ps.println(" public Test() {");
ps.println(" System.out.println(" + n + ");");
ps.println(" }");
ps.println("}");
ps.close();
os.close();
Runtime.getRuntime().exec("javac -d test
test/Test.java").waitFor();
URL[] url = new URL[1];
url[0] = new URL("file:test/");
URLClassLoader cl = new URLClassLoader(url);
Class.forName("Test", true, cl).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
dynno(i);
}
}
}