Auf Funktionen einer Klasse zugreifen
uepselon
- java
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
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
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
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
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
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
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
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
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
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