Indirektes aufrufen einer Klasse (Folge 2 :-))
Carl
- java
Hallo,
besten Dank an alle die mir letztes mal geholfen haben (link zum damaligen problem unten), das Problem dass ich trotz der Tips kein Erfolg hatte lag an meinem Netbeans.
Nun Habe ich noch eine erweiterungs Frage:
Wie kann ich diesem Konstrukt auch noch Argumente mitgeben?
Die argumente werden schon passend zurecht geschnitten und in einem String-Array abgelegt das an die Hilfsklasse übergeben wird.
Hier mal ein auszug aus der Hilfsklasse:
static void callMethod(String method, String[] arguments) {
// Arguments wird zwar schon übergeben, aber noch nicht verwendet.
boolean error = true;
...
try {
Object o = Class.forName(method).newInstance();
error = false;
} catch (java.lang.Throwable e) {
System.out.println(e);
}
...
if (error == false)
System.out.println("Ohne Fehler beendet: " + method + "\n");
...
}
Also der Klasse die dort mit newInstance aufgerufen wird, möchte ich nun noch Argumente mitgeben. Entweder direkt mittels des arguments Arrays oder per schleife.
z.B. Die Methode HelloWorld mit den Argumenten "Carl", "dankt" und "denSelfforumUsern" (in arguments[0-2])
die dann z.B.
"Hello,
Carl dankt denSelfforumUsern."
ausgibt.
Vielen Dank schon mal für die Hilfe.
Gruß,
Carl
Hallo,
Also der Klasse die dort mit newInstance aufgerufen wird, möchte ich nun noch Argumente mitgeben. Entweder direkt mittels des arguments Arrays oder per schleife.
Ich würde die Parameter nicht dem Constructor mitgeben wollen. (Man
kann es natürlich. Aber dazu später mehr.)
Du solltest zusehen, daß du ein Interface definierst, das von _allen_
Plugins implementiert werden _muß_. Dann könntest du dort nämlich
eine Methode "initialize(String[])" definieren, die eben in allen
Plugins zur Verfügung gestellt wird.
Dein Code würde dann so aussehen:
MyPluginInterface o = (MyPluginInterface)Class.forName(method).newInstance();
o.initialize(arguments);
Das ganz machst du dann in einen Try-Catch-Block, der die Classcast-
Exception abfängt, falls ein (fehlerhaftes) Plugin doch dein
Plugin-Interface "MyPluginInterface" nicht implementiert.
Du solltest das wirklich so machen. Alles andere ist eine hochgradige
Bastel-Lösung!
Schlechtere Lösung:
Die könntest dem Konstruktor aber auch dein argument-String[]
mitgeben. (Dann funktioniert das mit dem Interface aber nicht mehr,
weil man darin keine Konstruktoren vorgeben kann.)
Dazu mußt du dir über die Methode Class.getConstructor(Class[]) den
gewünschten Konstruktor besorgen. (Alternativ kannst du dir über
Class.getConstructors() alle Konstruktoren liefern lassen und dann
den passenden raussuchen.)
Das zurückgelieferte Constructor-Objekt hat dann wieder eine Methode
"newInstance(Object[])", die im Object-Array die jeweiligen Parameter
entgegen nimmt.
Kurzes Beispiel:
Constructor c = Class.forname(klasse).getConstructor(String[].class);
c.newInstance(arguments);
oder so ähnlich halt.
Du solltest aber lieber die Version mit dem Interface in der Initialisierungs-
methode verwenden. Ist auch einfacher zu implementieren.
Gruß
Slyh
Besten Dank,
werde das mal probieren.
Gruß,
Carl