G
Guest
Gast
Hallo,
ich habe folgende Aufgabenstellung:
Zur Laufzeit generiere ich eine Java Klasse, die ich anschließend compiliere und mithilfe eines Tools Stub Klassen daraus erzeuge. Diese Stub Klassen werden dynamisch erzeugt und in einem Verzeichnis abgelegt. Diese Stub Klassen werden dann anschließend benötigt um die selbst generierte Klasse zu nutzen.
Das Problem ist, dass ich zwar die einzelnen Klassen aus dem Verzeichniss laden kann aber sie dann anschließend trotzdem nicht gefunden werden. Mithilfe von einem URLClassLoader kann ich zwar selber Instanzen der Klassen erstellen aber sie werden eben nicht von anderen Klassen gefunden, die per Class.forName nach ihnen suchen.
Frage: Wie kann ich die Klassen aus dem Verzeichnis so laden, dass ich, wenn ich mit Class.forName("Classenname"); nach ihnen suche sie auch finde?
(Das ganze findet im Rahmen von WebServices statt. Die Methoden eines WebServices sollen mithilfe einer XML Datei beschrieben werden. Aus dieser generiere ich eine .java Datei, die compilirt und anschließend darauf das wsgen Tool verwendet wird. Dann will ich mit dieser Service Klasse einen Endpoint publishen aber der benötigt eben die von wsgen generierten Stub Klassen, die zuerst geladen werden müssen)
ich habe folgende Aufgabenstellung:
Zur Laufzeit generiere ich eine Java Klasse, die ich anschließend compiliere und mithilfe eines Tools Stub Klassen daraus erzeuge. Diese Stub Klassen werden dynamisch erzeugt und in einem Verzeichnis abgelegt. Diese Stub Klassen werden dann anschließend benötigt um die selbst generierte Klasse zu nutzen.
Das Problem ist, dass ich zwar die einzelnen Klassen aus dem Verzeichniss laden kann aber sie dann anschließend trotzdem nicht gefunden werden. Mithilfe von einem URLClassLoader kann ich zwar selber Instanzen der Klassen erstellen aber sie werden eben nicht von anderen Klassen gefunden, die per Class.forName nach ihnen suchen.
Frage: Wie kann ich die Klassen aus dem Verzeichnis so laden, dass ich, wenn ich mit Class.forName("Classenname"); nach ihnen suche sie auch finde?
Code:
try
//load classes
URL url = new File(path).toURI().toURL();
URLClassLoader cl = new URLClassLoader(new URL[] { url });
//get names from auto generated classes
Stack<File> dirs = new Stack <File>();
List<String> filesName = new ArrayList<String>(256);
File classDir = new File (path+"/jaxws");
Pattern p = Pattern.compile("(.*\\.class$)",Pattern.CASE_INSENSITIVE);
if (classDir.isDirectory()&&classDir.exists()){
dirs.push(classDir);
}else{
throw new IOException("Error while loading auto generated classes");
}
while(dirs.size()>0){
for (File file : dirs.pop().listFiles()){
if(p.matcher(file.getName()).matches()){
filesName.add(file.getName());
//System.out.println("Name of the file to Load: " + file.getName());
}
}
}
//load auto generated classes
Iterator<String> i = filesName.iterator();
while (i.hasNext()){
String className = i.next();
//remove .class form name
className = className.substring(0, className.length()-6);
//add package to name
className = "jaxws." + className;
System.out.println("Load " + className);
cl.loadClass(className);
}
//TEST: load Class Copy_to_cache
Class<?> testClass = Class.forName("jaxws.Copy_to_cache");
testClass.newInstance();
System.out.println(testClass.toString());
}
catch (Exception e)
{
e.printStackTrace();
}
(Das ganze findet im Rahmen von WebServices statt. Die Methoden eines WebServices sollen mithilfe einer XML Datei beschrieben werden. Aus dieser generiere ich eine .java Datei, die compilirt und anschließend darauf das wsgen Tool verwendet wird. Dann will ich mit dieser Service Klasse einen Endpoint publishen aber der benötigt eben die von wsgen generierten Stub Klassen, die zuerst geladen werden müssen)