![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Senior Member
![]() Registriert seit: 05.08.2005
Beiträge: 181
|
![]() Hallo!
Ich lerne gerade Java und habe eine grundsätzliche Frage: Wie implementiere ich in Java am besten einen PlugIn-Manager? Der Anwender soll also eine Datei herunterladen können, welche er dann in ein Verzeichnis im Programme-Ordner speichert, dh das PlugIn muss praktisch eine Klasse abgeleitet von einem Interface sein, welche bei Programmstart instanziert wird. Nur wie instanziere ich diese Klasse bzw woher weiß ich überhaupt dass sie existiert? Und wie umgehe ich, dass sich das Programm aufhängt, wenn das PlugIn fehlerhaft ist? Vielen Dank schon mal für eure Antworten, mfg sesselhocker |
![]() |
![]() |
![]() |
#2 | ||
Inventar
![]() Registriert seit: 13.06.2001
Beiträge: 1.830
|
![]() Zitat:
java.io.File mit den Methoden: isDirectory() und listFiles() Klassen instanzieren von denen man den Namen erst zur Laufzeit kennt geht mit der Methode Class.forName() (der Überbegriff dazu ist Reflection). http://java.sun.com/developer/techni...LT/Reflection/ Zitat:
Den Klassischen "diese Anwendung verursachte eine Zugriffsverletzung" Fehler fängst du in Java mit Exception handling ab (try{}catch(SomeException se){}catch(SomeOtherException soe){}finally{} Blöcke). Das andere Problem ist, was passiert wenn das Plugin in eine Endlosschleife hineinläuft. Um auf so etwas reagieren zu können ist es auf jeden Fall sinnvoll das Plugin in einem eigenen Thread zu starten. jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona) Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing. \"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra) |
||
![]() |
![]() |
![]() |
#3 |
Senior Member
![]() Registriert seit: 21.02.2004
Beiträge: 104
|
![]() Eine andere (vielleicht für Deine Anforderungen ungeeignete) Idee wäre die Verwendung von Java Web Start?
Grüße |
![]() |
![]() |
![]() |
#4 |
Senior Member
![]() Registriert seit: 05.08.2005
Beiträge: 181
|
![]() Danke für eure Antworten!
Vor allem erstere hat mir sehr geholfen (Stichwort "Reflection"). mfg, sesselhocker |
![]() |
![]() |
![]() |
#5 |
Senior Member
![]() Registriert seit: 05.08.2005
Beiträge: 181
|
![]() Ok, habs jetzt soweit (zugegeben, ich hab noch net viel weiter gemacht). Naja jedenfalls hab ich jetzt folgendes Problem:
Class plugin = Class.forName("irgendeinname"); JLabel label = new JLabel(plugin.getLabel()); Natürlich kann ich die Instanz Class plugin nicht in eine Instanz ServerPlugin plugin umwandeln ("inconvertible types"). Aber wie sage ich ihm dann, dass es die Methode getLabel() gibt ("cannot find symbol")? Danke schon mal! mfg sesselhocker |
![]() |
![]() |
![]() |
#6 |
Inventar
![]() Registriert seit: 13.06.2001
Beiträge: 1.830
|
![]() Doch, sollte gehen:
Code:
Class c; String cn = example.classname; Constructor con = null; Class[] constructorParameterClasses = {Class1.class, Class2.class}; //the classes of the paramters for the constructor Object[] constructorParameters = {new Class1, new Class2} //the parameters for the constructor try { c = Class.forName(cn, false, this.getClass().getClassLoader()); } catch (ClassNotFoundException ex) { //Class not found, do something } try { con = c.getConstructor(constructorParameterClasses); } catch (SecurityException se) { //Security Manager denied access } catch (NoSuchMethodException nsme) { //No such Method. Perhaps the constructor is not public? } Object o1 = null; try { o1 = c1.newInstance(constructorParameters); } catch (InvocationTargetException ite) { //if the underlying constructor throws an exception. } catch (IllegalArgumentException iare) { //wrong number of params? //if the number of actual and formal parameters differ; //if an unwrapping conversion for primitive arguments fails; // or if, after possible unwrapping, a parameter value cannot be converted // to the corresponding formal parameter type by a method invocation // conversion. } catch (IllegalAccessException iace) { //constructor not Public } catch (InstantiationException ie) { //Cannot execute constructor make sure it is not abstract; } catch (ExceptionInInitializerError eiie) { //if the initialization provoked by this method fails. } try { SomeOtherClass soc = (SomeOtherClass) o1; } catch (ClassCastException cce){ //cast to new Class failed. } sein. Wenn der Cast nicht funktioniert, liegt es vermutlich daran, wie die Hierarchie (Vererbung) deiner Klassen aufgebaut ist. jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona) Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing. \"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra) |
![]() |
![]() |
![]() |
#7 |
Senior Member
![]() Registriert seit: 05.08.2005
Beiträge: 181
|
![]() Hallo!
Danke, das war flott! Hab mir anhand deines Codes selber was zusammengestrickt, aber es kommt immer eine ClassNotFoundException: ServerPlugin plugin = (ServerPlugin)Class.forName(pluginDir.getName()+Fi le.separatorChar+plugins[i]).getConstructor().newInstance(); Die Klasse gibts und wenn ich den Pfad auf der Konsole ausgebe, dann wird er auch korrekt angezeigt ("plugins\Plugin.class"). Thx, mfg sesselhocker PS: Ich weiß, ich bin ein Minimalist ;-) |
![]() |
![]() |
![]() |
#8 |
Inventar
![]() Registriert seit: 13.06.2001
Beiträge: 1.830
|
![]() Das Argument das ClassForName erwartet ist der Name der Klasse, z.B. "Plugin".
Üblicherweise sind die Namen in Java aber so gewählt das sie eindeutig sind, z.B. com.ibm.etc.pp (qualified names). Wenn du die Klasse mit Class c = Class.forName("Plugin") lädst und immer noch eine ClassNotFoundException auftritt, ist wahrscheinlich das Plugin Verzeichnis nicht im classpath (der Pfad in dem nahc .class Dateien gesucht wird) von java enthalten --> Beim Aufruf von java die Richtigen Parameter verwenden (weiß ich jetzt nicht auswendig, sollte so etwas ähnliches wie -classpath="pfad1,pfad2" sein). Prinzipiell sollte man auch zur Laufzeit .class Dateien nachladen können, eventuell geht das mit: Code:
import java.lang.Runtime; ... Runtime rt = Runtime.getRuntime(); rt.load("Pfad/name.der.Klasse.class"); Class c = Class.forName("name.der.Klasse"); Einfacher ist es aber, wenn die Dateien schon von vornherein im classpath liegen, dann kann man sich das sparen. jak
____________________________________
Join the DNRC | Godwin\'s Law (thx@stona) Documentation is like sex: If it\'s good, it\'s very, very good. If it\'s bad, it\'s better than nothing. \"In theory, theory and practice are the same. In practice, they are not\" (Lawrence Berra) |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|