ClassLoader-problem
Flg. kode er oprindelig inspireret af bla. http://eksperten.dk/spm/410887.Den flg. kodestump:
import java.io.*;
import java.net.*;
public class Classloading {
private static void dynno(int n) {
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 test/Test.java").waitFor();
URLClassLoader cl = new URLClassLoader(new URL[]{new URL("file:test/")});
cl.loadClass("Test").newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
(new File("test")).mkdir();
for(int i = 0; i < 10; i++) {
dynno(i);
}
}
}
- virker og udskriver 0 1..9.
Jeg prøver nu at ændre en smule i koden ved at indføre nogle package-statements:
package Classloading;
import java.io.*;
import java.net.*;
public class Classloading {
private static void dynno(int n) {
try {
OutputStream os = new FileOutputStream("c:/Classloading/Test.java");
PrintStream ps = new PrintStream(os);
ps.println("package Classloading;");
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 -classpath c:/ c:/Classloading/Test.java").waitFor();
URLClassLoader cl = new URLClassLoader(new URL[]{new URL("file:c:/Classloading/")});
cl.loadClass("Classloading.Test").newInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
dynno(i);
}
}
}
- men nu udskriver programmet kun lutter 0'er, altså 0 0..0.
Det er som om, at programmet kun load'er den første klasse-definition eller bruger samme classloader hver gang eller..
Hvad kan der være galt her?
