WCM - Das österreichische Computer Magazin Forenübersicht
 

Zurück   WCM Forum > Rat & Tat > Programmierung

Programmierung Rat & Tat für Programmierer

Microsoft KARRIERECAMPUS

Antwort
 
Themen-Optionen Ansicht
Alt 08.05.2007, 17:17   #1
sesselhocker
Senior Member
 
Registriert seit: 05.08.2005
Beiträge: 181


Standard 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
sesselhocker ist offline   Mit Zitat antworten
Alt 10.05.2007, 21:52   #2
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

Zitat:
Nur wie instanziere ich diese Klasse bzw woher weiß ich überhaupt dass sie existiert?
Ich würd einfach das Plugin Verzeichnis aufmachen und nachschauen:
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:
Und wie umgehe ich, dass sich das Programm aufhängt, wenn das PlugIn fehlerhaft ist?
Kommt drauf an...
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)
jak ist offline   Mit Zitat antworten
Alt 11.05.2007, 12:28   #3
Erechtheus
Senior Member
 
Registriert seit: 21.02.2004
Beiträge: 104


Standard

Eine andere (vielleicht für Deine Anforderungen ungeeignete) Idee wäre die Verwendung von Java Web Start?

Grüße
Erechtheus ist offline   Mit Zitat antworten
Alt 11.05.2007, 18:04   #4
sesselhocker
Senior Member
 
Registriert seit: 05.08.2005
Beiträge: 181


Standard

Danke für eure Antworten!

Vor allem erstere hat mir sehr geholfen (Stichwort "Reflection").

mfg, sesselhocker
sesselhocker ist offline   Mit Zitat antworten
Alt 15.05.2007, 20:15   #5
sesselhocker
Senior Member
 
Registriert seit: 05.08.2005
Beiträge: 181


Standard 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
sesselhocker ist offline   Mit Zitat antworten
Alt 15.05.2007, 20:39   #6
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

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.
}
In deinem Fall müsste es so etwas wie: ServerPlugin server_plugin = (ServerPlugin) plugin;
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)
jak ist offline   Mit Zitat antworten
Alt 15.05.2007, 22:06   #7
sesselhocker
Senior Member
 
Registriert seit: 05.08.2005
Beiträge: 181


Standard

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 ;-)
sesselhocker ist offline   Mit Zitat antworten
Alt 16.05.2007, 17:52   #8
jak
Inventar
 
Registriert seit: 13.06.2001
Beiträge: 1.830


Standard

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");
Das hab' ich aber noch nie verwendet -> Ausprobieren.
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)
jak ist offline   Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 03:57 Uhr.


Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Forum SEO by Zoints
© 2009 FSL Verlag