Slyh: Indirektes aufrufen einer Klasse (Folge 2 :-))

Beitrag lesen

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