Hallo Christoph
Hier mal ein kleines Beispiel eines ClassLoaders der die Klasse jedesmal neu läd:
Load.java
import java.io.*;
public class Load extends ClassLoader {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String s;
while((s =in.readLine()) != null) {
ClassLoader cl = new Load();
Object obj = cl.loadClass(s).newInstance();
System.out.println(obj.toString());
}
}
public Class findClass(String name) throws ClassNotFoundException {
byte[] b = loadClassData(name);
return defineClass(name, b, 0, b.length);
}
private byte[] loadClassData(String name) throws ClassNotFoundException {
byte[] data = new byte[0];
try {
InputStream in = getResourceAsStream(name+".class");
byte[] buf = new byte[100];
int i;
while((i = in.read(buf)) != -1) {
byte[] tmp = new byte[data.length + i];
System.arraycopy(data,0,tmp,0,data.length);
System.arraycopy(buf,0,tmp,data.length,i);
data = tmp;
}
}
catch(Exception e) {
throw new ClassNotFoundException(name);
}
return data;
}
protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class c = null;
try {
c = findClass(name);
if (resolve) {
resolveClass(c);
}
}
catch(ClassNotFoundException e) {
c = super.loadClass(name,resolve);
}
return c;
}
}
Test.java
public class Test {
public String toString() {
return "abcabcabc";
}
}
Das Programm Load ließt den Klassennamen von STDIN, läd die Klasse, erzeugt eine Instanz, ruft toString() auf selbige auf und gibt das Ergebnis aus.
Man kann Test.java ändern und neu kompilieren, wärend Load läuft.
Man sollte in einem Programm sogar mehrere Versionen einer Klasse gleichzeitig verwenden können, da Klassen nicht nur über Name und Package sondern auch über den ClassLoader identifiziert werden.
Wenn man natürlich Methoden in einer Klasse löscht, auf die eine Instanz der Klasse noch zugreift, wird es wohl ärger geben. (Falls der selbe ClassLoader verwendet wird)
Grüße
Daniel
so short
Christoph Zurnieden