Hallo...
ich muss durch mein Studium Java verwenden und habe immermal einige Kanten und Ecken, an denen ich haengen bleibe. Bevorzugt programmiere ich in Python und bin daher ein aeusserst bequemer Mensch ^^
Naja, nun zu meiner Frage:
Wir planen derzeit ein groesseres Projekt und moechten, dass es aus einzelnen Jar-Dateien zusammengestellt wird. Es sollte soweit gehen, dass der Kern des Programmes sehr klein ist und jegliche weitere Funktionalitaet ein "PlugIn" darstellt. Dadurch waeren zB Oberflaeche und Dateimanagement komplett austauschbar.
Zur Realisierung verwende ich nun Class.forName, stoße dabei aber leider auf gewisse Grenzen. Ich moechte, dass es moeglich ist, per (zB) Textdatei die zu ladenden Klassen anzugeben.
Hier meine einfache Plugin-Klasse:
Diese Klasse sorgt sozusagen dafuer, dass import dspl_core.Dspl_Core nicht zur Compilertime sondern waerend der Laufzeit erfolgt. Gut und schoen, wenn man weiß *was* man importiert.
Habe ich jetzt aber besagte Textdatei in der nur einfach "dspl_core.Dspl_Core" steht, dann kann ich zwar eine Instanz der richtigen Klasse erzeugen, aber nicht so Casten, dass ich sie auch verwenden kann (Zeile 10)... oder doch? Wenn ja: Wie??
Vielen Dank fuer jegliche geopferte Zeit...
ich muss durch mein Studium Java verwenden und habe immermal einige Kanten und Ecken, an denen ich haengen bleibe. Bevorzugt programmiere ich in Python und bin daher ein aeusserst bequemer Mensch ^^
Naja, nun zu meiner Frage:
Wir planen derzeit ein groesseres Projekt und moechten, dass es aus einzelnen Jar-Dateien zusammengestellt wird. Es sollte soweit gehen, dass der Kern des Programmes sehr klein ist und jegliche weitere Funktionalitaet ein "PlugIn" darstellt. Dadurch waeren zB Oberflaeche und Dateimanagement komplett austauschbar.
Zur Realisierung verwende ich nun Class.forName, stoße dabei aber leider auf gewisse Grenzen. Ich moechte, dass es moeglich ist, per (zB) Textdatei die zu ladenden Klassen anzugeben.
Hier meine einfache Plugin-Klasse:
Code:
package pluginmanager;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Pluginmanager {
public static void main(String[] args) {
try {
dspl_core.Dspl_Core shell = (dspl_core.Dspl_Core)getInstance("dspl_core.Dspl_Core"); shell.run();
}
catch (ClassNotFoundException e) {System.out.println(e.getMessage());}
}
private static Object getInstance(String name, Class[] coParams, Object[] inParams) throws ClassNotFoundException {
try {
Class cl = Class.forName(name);
Constructor co = cl.getConstructor(coParams);
Object obj = co.newInstance(inParams);
return obj;
}
catch (SecurityException e) {System.out.println(e.getMessage());}
catch (NoSuchMethodException e) {System.out.println(e.getMessage());}
catch (IllegalArgumentException e) {System.out.println(e.getMessage());}
catch (InstantiationException e) {System.out.println(e.getMessage());}
catch (IllegalAccessException e) {System.out.println(e.getMessage());}
catch (InvocationTargetException e) {System.out.println(e.getMessage());}
Object obj = new Object();
return obj;
}
private static Object getInstance(String name) throws ClassNotFoundException {
try {
Object obj = Class.forName(name).newInstance();
return obj;
}
catch (ClassNotFoundException e) {System.out.println(e.getMessage());}
catch (SecurityException e) {System.out.println(e.getMessage());}
catch (IllegalArgumentException e) {System.out.println(e.getMessage());}
catch (InstantiationException e) {System.out.println(e.getMessage());}
catch (IllegalAccessException e) {System.out.println(e.getMessage());}
Object obj = new Object();
return obj;
}
}
Diese Klasse sorgt sozusagen dafuer, dass import dspl_core.Dspl_Core nicht zur Compilertime sondern waerend der Laufzeit erfolgt. Gut und schoen, wenn man weiß *was* man importiert.
Habe ich jetzt aber besagte Textdatei in der nur einfach "dspl_core.Dspl_Core" steht, dann kann ich zwar eine Instanz der richtigen Klasse erzeugen, aber nicht so Casten, dass ich sie auch verwenden kann (Zeile 10)... oder doch? Wenn ja: Wie??
Vielen Dank fuer jegliche geopferte Zeit...