![]() |
PlugIn-Manager Java
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 |
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 |
Eine andere (vielleicht für Deine Anforderungen ungeeignete) Idee wäre die Verwendung von Java Web Start?
Grüße |
Danke für eure Antworten!
Vor allem erstere hat mir sehr geholfen (Stichwort "Reflection"). mfg, sesselhocker |
Nächste Frage...
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 |
Doch, sollte gehen:
Code:
Class c; sein. Wenn der Cast nicht funktioniert, liegt es vermutlich daran, wie die Hierarchie (Vererbung) deiner Klassen aufgebaut ist. jak |
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 ;-) |
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; Einfacher ist es aber, wenn die Dateien schon von vornherein im classpath liegen, dann kann man sich das sparen. jak |
Alle Zeitangaben in WEZ +2. Es ist jetzt 15:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag