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

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

  1. 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

    1. Besten Dank,
      werde das mal probieren.

      Gruß,
        Carl