uepselon: Auf Funktionen einer Klasse zugreifen

Hallo,

ich habe zwei Java Klassen one.class und two.class

in one.class wird zur Laufzeit ein Objekt der Klasse two instanziert.
Dies geschieht nicht über den normalen weg mit "new ClassName()" sondern per Class.forName(ClassName).newInstance().

Das funktioniert ja auch alles schön und gut, nur muss ich jetzt in two.class auf eine Funktion in one.class Zugreifen. Das Problem ist, das ich das Objekt one nicht einfach an two.class übergeben kann, da erstens keine Paramter an den Konstruktor übergeben werden können, da per newInstance() erzeugtes Objekt. Und zweitens ich keine Funktionen aus two.class aufrufen kann, da das erzeugen des Objekts allgeimein so erfolgt:

JInternalFrame twoObj = (JInternalFrame)Class.forName("two").newInstance();

Definiere ich in two.class z.B.

public void uebergabe_handle(one handle)
    {
    this.handle = handle;
    }

Und rufe diese in one.class nachdem erzeugen von two auf:

JInternalFrame twoObj = (JInternalFrame)Class.forName("two").newInstance();

twoObj.uebergabe_handle(this);

Kommt der Fehler das JInternalFrame keine Mehtode uebergabe_handle kennt.

Mach ich:

two twoObj = (two)Class.forName("two").newInstance();

twoObj.uebergabe_handle(this);

Gehts es, nur habe ich eben viele solcher Klassen die Eingebunden werden sollen, und daher muss ich allgemein mit JInternalFrame definieren.

Hat jemand einen Rat wie ich einen gültigen Handle von one.class an two.class schicken kann?

Gruß

ueps

  1. Hi

    ich habe zwei Java Klassen one.class und two.class

    in one.class wird zur Laufzeit ein Objekt der Klasse two instanziert.
    Dies geschieht nicht über den normalen weg mit "new ClassName()" sondern per Class.forName(ClassName).newInstance().

    [...]

    Guck Dir java.lang.reflect.Method an.

    Andreas

  2. Hallo,

    ich hoffe das Handwerkszeug was ich Dir in dieHand gebe hilft Dir, ohne dass ich es an Deinem Beispiel erkläre.
    Die Klasse java.lang.Class kennt ja die Methode getDeclaredMethod. Darüber bekommst Du ja die in einer Klasse deklarierten Methoden als Objekt vom Typ java.lang.reflect.Method.
    Dieses Objekt kennt eine Methode invoke worüber Du Methoden aufrufen kannst.
    Genaueres siehe API-Doku.
    Ich hoffe das hilft Dir weiter.

    Gruss
       MichaelB

    1. Hi,

      Danke schon mal, aber ich bin noch nicht wirklich weitergekommen, die sun java Doku zu den besagten Funktionen ist recht unverständliche.

      Ich hab hier mal ein paar Code Schipsel:

      Auszug aus one.class:

      public void openScreen(String screen)
                  {
                  try
                     {
                     JInternalFrame newone = (JInternalFrame)Class.forName(screen).newInstance();

      newone.setLocation(10, 10);
                     desktop.add(newone);
                     newone.moveToFront();
                     }
                  catch (ClassNotFoundException e) {}
                  catch (IllegalAccessException e) {}
                  catch (InstantiationException e) {}
                  }

      über openScreen("two") öffnet sich Klasse two und wird als InternalFrame auf den Desktop Container hinzugefügt.

      Auszug aus two.class:

      class two extends JInternalFrame implements ActionListener
            {
      ...
      public void button_klick()
         {
         openScreen("three"); ????
         }
      }

      In two.class soll nun ein drittes InternalFrame geöffnet werden, dazu muss jedoch die Methode openScreen aus one.class angesprochen werden und um dies zu machen, brauche ich den Objekthandle von one.

      Ich steh jtzt irgendwie völlig auf dem Schlauch, was muss ich denn genau machen?

      Gruß

      ueps

  3. Hallo ueps!

    two twoObj = (two)Class.forName("two").newInstance();

    twoObj.uebergabe_handle(this);

    Gehts es, nur habe ich eben viele solcher Klassen die Eingebunden werden sollen, und daher muss ich allgemein mit JInternalFrame definieren.

    Vermutlich willst Du sowas:
    InternalFrame twoObj = (InternalFrame)Class.forName("two").newInstance();
    if(twoObj instanceof two) {
       ((twoObj).uebergabe_handle(this);
    }

    Außerdem kannst Du sehr wohl auch über die Reflection API Parameter an den Konstruktor übergeben.

    Siehe die Methoden:
    java.lang.Class.getConstructors(...)
    java.lang.reflect.Constructor.newInstance(...)

    Grüße

    Daniel

    1. Hi,

      Vermutlich willst Du sowas:
      InternalFrame twoObj = (InternalFrame)Class.forName("two").newInstance();
      if(twoObj instanceof two) {
         ((twoObj).uebergabe_handle(this);
      }

      Ja genau so in der Art, nur so gehts leider nicht, da kommt der Fehler: uebergabe_handle ist keine Methode der Klasse JInternalFrame

      Außerdem kannst Du sehr wohl auch über die Reflection API Parameter an den Konstruktor übergeben.

      Siehe die Methoden:
      java.lang.Class.getConstructors(...)
      java.lang.reflect.Constructor.newInstance(...)

      Hm das mit der Reflection API ist etwas verwirrend, wie genau muss ich da denn vorgehen?

      sprich muss ich auf twoObj getConstructors anwenden oder schon vorher?

      Gruß

      ueps

      1. Hallo

        Vermutlich willst Du sowas:
        InternalFrame twoObj = (InternalFrame)Class.forName("two").newInstance();
        if(twoObj instanceof two) {
           ((twoObj).uebergabe_handle(this);

        ((two)twoObj).uebergabe_handle(this); //so meinte ich das natürlich

        }

        Siehe die Methoden:
        java.lang.Class.getConstructors(...)
        java.lang.reflect.Constructor.newInstance(...)

        sprich muss ich auf twoObj getConstructors anwenden oder schon vorher?

        getConstructor musst Du natürlich auf die Klasse two anwenden:
        two.class.getConstructor()

        Grüße

        Daniel

        1. Hallo,

          Vermutlich willst Du sowas:
          InternalFrame twoObj = (InternalFrame)Class.forName("two").newInstance();
          if(twoObj instanceof two) {
             ((twoObj).uebergabe_handle(this);
          ((two)twoObj).uebergabe_handle(this); //so meinte ich das natürlich
          }

          Schön und gut aber wenn ich (two) schreiben kann, kann ich auch gleich two twoObj = new two(this); schreiben ;-)

          Das Problem ist, das ich nur Anhand eines Strings ("two") die dazugehörende Klasse bzw. das Objekt erstellen will.
          Ich habe eine vielzahl von Klassen von denen ich zur Laufzeit Objekte erstellen will. Daher sollte alles dynamisch ablaufen.

          sprich muss ich auf twoObj getConstructors anwenden oder schon vorher?
          getConstructor musst Du natürlich auf die Klasse two anwenden:
          two.class.getConstructor()

          Und wie gehts dann weiter?

          Danke für deine Mühe

          ueps

          1. Ich habs hinbekommen, für alle die es evtl. auch interssieren könnte hier meine Lösung:

            try
                           {
                           Class newclass = Class.forName("two");
                           Class[] param = new Class[1];
                           param[0] = one.class;

            Constructor cons = newclass.getConstructor(param);
                           Object[] arg = new Object[] {this};
                           Object twoObj = cons.newInstance(arg);

            }
                        catch (Exception e) {}

            Der Konstruktor von two.class erwartet einen String als Paramter.

            Gruß

            ueps

            1. Der Fehlerteufel lässt grüßen:

              Der Konstruktor von two.class erwartet einen String als Paramter.

              Keinen String sondern den Handle vom Objekt der Klasse "one"

              Gruß

              ueps