Objekte durch Reflection erzeugen

Status
Nicht offen für weitere Antworten.

qwer

Mitglied
Hi!

Ich habe eine kleine Anwendung geschrieben und will diese leicht erweiterbar machen. Der Kern ist ein JTabedPane auf das verschiedene JPanels gehängt werden.
Ich möchte aber gern, dass einfach alle, die sich in einem gewissen Ordner befinden, erzeugt und automatisch eingefügt werden.

Kann mir wer eventuell Tipps geben, wie ich das am besten machen kann?
 

Wildcard

Top Contributor
Man kann nur davon abraten so etwas selbst basteln zu wollen. Was sich hinter dem Buzzword PlugIn versteckt, wird schnell hochkompliziert und daher sollte man auf bestehende Lösungen wie OSGi/Eclipse RCP setzen.
 

qwer

Mitglied
Kann man das nicht irgendwie so machen, dass man sich die libaries die die neuen panels brauchen würden über einen loader lädt und dann über class.forName() sich ein Objekt erzeugt?
Oder ist da noch viel mehr dazu notwendig?

Werd mir das mal anschauen was du gemeint hast und danke für den tipp
 

Wildcard

Top Contributor
Man kann eine Klasse über (zB) einen URLClassLoader laden und anschließend instanzieren (wenn es einen öffentlichen Konstruktor gibt).
Sobald dann allerdings Abhängigkeiten und Bibliotheken hinzukommen wird alles zur Classloader Hölle.
 

qwer

Mitglied
Hm verstehe. Aber man kann man auch die ganzen class files(also alle libaries die nicht standardmäßig dabei sind und für das panel gebraucht werden) in ein jar zusammenpacken und das über den loader reinladen?

und dann mit dem forName instanzieren?
oder geht das nicht so einfach mit dem URLClassLoader?
 

foobar

Top Contributor
Das geht schon ist aber keine schöne Lösung.

Woher weißt du denn in welcher Stelle deiner Anwendung die neuen Klassen genutzt werden sollen z.b.. wo die Panels erscheinen sollen?

All das leistet Eclipse Equinox(Osgi) bereits out of the box. Also warum das Rad neu erfinden?
 

qwer

Mitglied
Naja ich weiß das, da ich es nur an einer Stelle zulassen möchte und das sollte als neues Tab in einem JTabedPane sein. Das programm ist als eine ansammlung von kleinen programmen zu einem thema gedacht. Daher ist das wo kein Problem. Hab das jetzt auch hinbekommen und funktioniert einwandfrei. Ist eventuell wirklich nicht die schönste Lösung aber ja...

Und zu warum das rad neu erfinden: Warum brauch ich das neueste und beste handy, wenn ich damit net mehr mach als zu telefonieren? Warum sollte ich dann auch für alles andre zahlen.
Außerdem ist es auch mal nett das selber zu schreiben. Ist mal ne nette Erfahrung.

Danke für den Link. Interessant ich hab das eigentlich fast genauso gelöst ohne das je vorher gesehen zu haben.

Den Code poste ich mal lieber nicht. Ist ein wenig verwirrend, weil ich die Sachen erst erzeuge, wenn sie benötigt werden, da die tools massig hautspeicher fressen. Ist also alles ein wenig unübersichtlich.
 

qwer

Mitglied
byto hat gesagt.:
Lazy Loading ist doch nichts ungewöhnliches!?

da is was dran aber es macht alles ein wenig unübersichtlicher. besonders weil ich noch daten aus einem file irgendwoher dazubrauch. Daher is die Lösung von dem netmal die hälfte von dem code
 

Wildcard

Top Contributor
Lazy Loading lässt sich in der Regel elegant über ein Proxy Objekt kapseln (siehe gleichnamiges Entwurfsmuster).
 

qwer

Mitglied
jo hast recht. das entwurfsmuster is mir eigentlich auch bekannt. Nur iirgendwie is dann der schritt die zu verwenden nicht immer da. besonders wenn es sich nur um ein paar zeilen handelt.
Es würd zwar alles übersichtlicher machen, aber naja...

Aber nochmal danke für die guten Tipps und auch vorallem, dass die schnell kamen
 
C

C_A

Gast

Link funktioniert nicht mehr.

Sieht so aus, als hätte ich das gleiche Problem. Ich habe eine TabbedPane und möchte die einzelnen Panels dynamisch erzeugen. Im Moment habe ich folgenden Code:
Java:
                Object meinObjekt; 
                while (ergebnisse.next())
                { 
                    String panel = ergebnisse.getString("PANEL");
                    String beschriftung = ergebnisse.getString("BESCHRIFTUNG");
                    Class c = Class.forName(panel); 
                    try
                    {
                        meinObjekt = c.newInstance();
                    }
                    catch (Exception ex)
                    {
                        System.out.println(ex);
                    }
                    tbbMain.add((Component) meinObjekt, "dynamisch" + beschriftung);

                    System.out.println(panel + " => " + beschriftung);
                }

ergebnisse ist ein ResultSet, das ich von einer Datenbankabfrage zurückkriege.

Panel ist der Klassenname.

Wenn ich den Code so ablaufen lasse wie oben, erhalte ich eins von vier Panels, deren Klassennamen und Beschreibung in der Datenbank hinterlegt sind.

Die Zeile, die ich mit try-catch umschlossen habe, verhindert, dass die while-schleife viermal durchlaufen wird. Sprich: wenn ich sie auskommentiere, wird die Schleife viermal durchlaufen. Eine Fehlermeldung wird nicht ausgeworfen.

Wo ist der Fehler?

By the way: ich arbeite nicht mit Eclipse, so dass die Verweise oben mir nichts bringen :-(
 
S

SlaterB

Gast
wenn sich ein Programm nicht mehr sinnvoll verhält, hast du ganz andere Probleme als Reflection,
schreibe zwischen jede Zeile
System.out.println("bin vor Zeile ..");

genauso ins catch,
und das einzige was du noch nicht abgefangen hast ist höheres als Exception, schreibe catch(Throwable),
wenn du dann nicht zu jedem Zeitpunkt weißt, in welcher Zeile das Programm ist, dann siehts düster aus

noch ne Möglichkeit wäre, dass der Konstruktor blockiert, also gar nichts mehr passiert im Programm/ in diesem Abschnitt, ist das der Fall?
 
C

C_A

Gast
wenn sich ein Programm nicht mehr sinnvoll verhält, hast du ganz andere Probleme als Reflection,
schreibe zwischen jede Zeile
System.out.println("bin vor Zeile ..");
Habe ich schon gemacht und dabei die Zeile, die blockiert, identifiziert.

genauso ins catch,
und das einzige was du noch nicht abgefangen hast ist höheres als Exception, schreibe catch(Throwable),
wenn du dann nicht zu jedem Zeitpunkt weißt, in welcher Zeile das Programm ist, dann siehts düster aus
Habe ich eingefügt - keine einzige Ausgabe :-(

noch ne Möglichkeit wäre, dass der Konstruktor blockiert, also gar nichts mehr passiert im Programm/ in diesem Abschnitt, ist das der Fall?
Nein, lediglich die Schleife wird nicht weiter augeführt. Der restliche Code des Construktor wird ordentlich ausgeführt.
 
S

SlaterB

Gast
> Der restliche Code des Construktor wird ordentlich ausgeführt.
heißt genau hinter der Schleife gehts weiter?
was ist denn mit ergebnisse.next(), weißt du was das ist, warum kommt das 4x, ist das ein ResultSet?
vielleicht wird in dem erstellten Objekt auch eine DB-Abfrage ausgeführt, dann kann es schon gut sein dass vorherige ResultSets geschlossen werden,
richtige Richtung?
 
C

C_A

Gast
> Der restliche Code des Construktor wird ordentlich ausgeführt.
heißt genau hinter der Schleife gehts weiter?
Ja! Ich habe vier Panels in der Datenbank hinterlegt - also deren Klassennamen. Als ich gemerkt habe, dass es nicht funktioniert, habe ich eine Variable deklärt: int i = 0; und in der Schleife: i++; SysOut.Println (i);

Alles in Ordnung - erst, wenn ich die Zeile in try-catch eingefügt habe, ist die Schleife nicht mehr durchgelaufen.

Vier, weil vier Panels in der Datenbank liegen.

was ist denn mit ergebnisse.next(), weißt du was das ist, warum kommt das 4x, ist das ein ResultSet?
vielleicht wird in dem erstellten Objekt auch eine DB-Abfrage ausgeführt, dann kann es schon gut sein dass vorherige ResultSets geschlossen werden,
richtige Richtung?
ergebnisse = datenbank.abfrage(sql) = ResultSet.

Eine DB-Abfrage im Konstruktor des ersten Panels ... müsste ich echt mal schauen, glaube aber nicht ... morgen im Büro schaue ich nochmal. Gute Idee!
 
C

C_A

Gast
Eine DB-Abfrage im Konstruktor des ersten Panels ... müsste ich echt mal schauen, glaube aber nicht ... morgen im Büro schaue ich nochmal. Gute Idee!

So, von meiner Seite ist das Thema erledigt - Slater hat mich auf die richtige Spur gebracht. Wenn ich das ResultSet in einer Hashmap zwischenspeichere, und dann über die Hashmap die while-Schleife setze, funktioniert es:


Java:
      HashMap<String, String> sammlung = new HashMap<String, String>();
                

                Object meinObjekt = null;
                while (ergebnisse.next())
                {
                    String panel = ergebnisse.getString("PANEL");
                    String beschriftung = ergebnisse.getString("BESCHRIFTUNG");

                    sammlung.put(panel, beschriftung);

  
                }

                for(String tmpPanel: sammlung.keySet())
                {
                    String beschriftung = tmpPanel.valueOf(tmpPanel);

                    c = Class.forName(tmpPanel);
                    try
                    {
                        meinObjekt = c.newInstance();
                    }
                    catch (Exception ex)
                    {
                        System.out.println(ex);
                    }
                     catch(Throwable t)
                     {
                         System.out.println(t.getMessage());
                     }
                    tbbMain.add((Component) meinObjekt, "dynamisch" + beschriftung);

                    System.out.println(tmpPanel + " => " + beschriftung);
                }

Soweit mal meine Quick'n'Dirty-Lösung.

Danke!
 
S

SlaterB

Gast
ansonsten darauf achten, getrennte Statement-Objekte zu verwenden, dann kann man ruhig auch mehrere ResultSets offen halten,

in jedem Fall am Ende immer soviel closen() wie möglich, ResultSets und Statements, evt. auch Connections
oben z.B. Zeile 14 ergebnisse.close(); wenn du ergebnisse nicht mehr brauchst!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
schegga_B javax.crypto - Cipher Objekte - Sevice Provider matching? Allgemeine Java-Themen 1
berserkerdq2 Weiß jemand wie ich im Scenebuilder das Fenster so darstellen kann, dass beim Vollbildmodus die Objekte so angezeigt werden? Allgemeine Java-Themen 1
A Einzelne Objekte und Unterobjekte einer ArrayList ausgeben Allgemeine Java-Themen 53
B Java Reflection Probleme beim wehcselseitigen Referenzieren zweier Klassen/Objekte Allgemeine Java-Themen 14
N einem Array Objekte hinzufügen die ihr Array position gespeichert haben Allgemeine Java-Themen 34
E Objekte in einen String packen und wieder laden Allgemeine Java-Themen 5
L Objekte in Set nicht gefunden Allgemeine Java-Themen 13
Avalon Data Transfer Objekte aus Datenbank erstellen Allgemeine Java-Themen 8
G Objekte mit Strings Aufrufen Allgemeine Java-Themen 8
H Objekte speichern und laden Allgemeine Java-Themen 10
H Objekte speichern und laden Allgemeine Java-Themen 1
MiMa Referenz auf Objekte und deren Inhalte Allgemeine Java-Themen 12
W Objekte reproduzieren Allgemeine Java-Themen 2
W Objekte per Reflexion instanziieren Allgemeine Java-Themen 7
W Unittest - Objekte simulieren Allgemeine Java-Themen 7
T OOP Objekte mit Erweiterung Initialisieren Allgemeine Java-Themen 6
O Erste Schritte Objekte als Datenelemente Allgemeine Java-Themen 14
J Equals Mock Objekte Allgemeine Java-Themen 5
J Mockito - Objekte miteinander vergleichen (equals) Allgemeine Java-Themen 6
N Bei Mouse Events nicht mehrere Objekte erstellen Allgemeine Java-Themen 13
J Zugriff auf erstellte Objekte einer Klasse von einer Klasse ausserhalb Allgemeine Java-Themen 3
J Java Objekte = null, Garbagecollector Allgemeine Java-Themen 12
F Listen - Mehrere Objekte Allgemeine Java-Themen 1
J Verständnis Frage zur Instanz, Objekte, Instanzierung, Referenz Allgemeine Java-Themen 14
F Objekte erzeugen Allgemeine Java-Themen 1
E Threads ThreadPoolExecutor remove mit callable Objekte Allgemeine Java-Themen 3
P mehrer Verschiedene Objekte in einer Klasse erstellen. Allgemeine Java-Themen 4
E OOP Objekte und Methoden Allgemeine Java-Themen 1
@SupressWarnings() Umgebungsvariable Objekte "gekoppelt" Allgemeine Java-Themen 6
S Algorithmus um Objekte auf einer Flaeche mit gleichem Abstand anzuordnen..? Allgemeine Java-Themen 20
C Objekte in Array List speichern? Allgemeine Java-Themen 1
OnDemand Objekte speichern Allgemeine Java-Themen 8
B Objekte anhand von Properties file Allgemeine Java-Themen 41
U Tiefe Objekte schreiben Allgemeine Java-Themen 1
R Abstrakte Basisklasse und instanzierte Objekte der abgeleiteten Klasse als Basisklasse übergeben Allgemeine Java-Themen 2
E 3D Objekte in 2D Bild finden Allgemeine Java-Themen 5
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
F FileOutput/Input Objekte Allgemeine Java-Themen 6
OnDemand Objekte serialisieren Allgemeine Java-Themen 3
J unterschiedliche Objekte, selbe getter und setter Allgemeine Java-Themen 15
L Lib gesucht: Java-Objekte mit JSON Allgemeine Java-Themen 2
U Set erklären dass objekte gleich sind Allgemeine Java-Themen 12
E Best Practice Verdammt große Objekte Allgemeine Java-Themen 10
B Mehrere Objekte verschlüsselt serialisieren Allgemeine Java-Themen 6
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
N Objekte an eine andere Applikation übergeben Allgemeine Java-Themen 3
N 2 Objekte zu einer Gruppe zusammenfügen Allgemeine Java-Themen 7
M Instanzierte Objekte in XML Dokument speichern Allgemeine Java-Themen 3
B Verschiedene Objekte in Abhängigkeit eines Typs instanziieren. Allgemeine Java-Themen 17
K Input/Output Im Programm instanzierte Objekte Speichern und laden Allgemeine Java-Themen 3
S OOP Objekte als Return-Werte: Einen Klon zurückgeben oder Instanz auf das Feld? Allgemeine Java-Themen 10
H Objekte Serialisiert speichern Allgemeine Java-Themen 10
L MouseListener für viele Objekte erstellen Allgemeine Java-Themen 16
5 Objekte Sortieren lassen Allgemeine Java-Themen 7
N Objekte aus Array Inhalt erzeugen Allgemeine Java-Themen 8
L Input/Output Textdatei in Objekte überführen? Allgemeine Java-Themen 4
R Input/Output Objekte speichern ohne überschreiben Allgemeine Java-Themen 7
A Collections HashMap.containsKey findet keine immutablen Objekte Allgemeine Java-Themen 3
H Threads Thread stirbt aber Objekte in ihm leben weiter?! Allgemeine Java-Themen 9
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
C Strings und JSON Objekte so klein wie möglich im Speicher ablegen Allgemeine Java-Themen 5
H COM-Objekte/ AktiveX Objekte Allgemeine Java-Themen 4
C Script für Website mit Objekte Ausblenden Allgemeine Java-Themen 3
M Txt einlesen & Objekte erzeugen Allgemeine Java-Themen 2
X Objekte aus TableModel serialisieren und deserialisieren Allgemeine Java-Themen 4
T ObjectInputStream - Arrayliste, die unbekannte Objekte enthält Allgemeine Java-Themen 9
B class dateien "einlesen" und objekte erzeugen Allgemeine Java-Themen 6
D Grafische Objekte zeichnen Allgemeine Java-Themen 4
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
F Referenzen auf Objekte Allgemeine Java-Themen 5
H Eclipse und Objekte Allgemeine Java-Themen 6
S Objekte die Objekte enthalten: Keine Vererbung Allgemeine Java-Themen 4
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
I Pattern zum Erweitern existierender Objekte Allgemeine Java-Themen 4
N Dynamische Objekte / DB Allgemeine Java-Themen 5
J Objekte binär speichern Allgemeine Java-Themen 10
TiME-SPLiNTER Unbekannte Anzahl serialisierter Objekte lesen Allgemeine Java-Themen 2
V Objekte in Kategorien einteilen. Allgemeine Java-Themen 6
M 3D Objekte mit einer Linie Verbinden Allgemeine Java-Themen 3
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
A Dummy-Objekte für Webgui erzeugen Allgemeine Java-Themen 12
W Objekte speichern mit JFileChooser Allgemeine Java-Themen 8
D befehl auf mehrere objekte anwenden Allgemeine Java-Themen 7
L Objekte in Liste packen Allgemeine Java-Themen 2
S XML in Objekte wandeln. Euer Rat? Allgemeine Java-Themen 12
G Objekte serialisieren Allgemeine Java-Themen 2
L Parameter-Objekte verändern oder nicht? Allgemeine Java-Themen 6
D Objekte nur unter bestimmten Voraussetzungen erzeugen Allgemeine Java-Themen 4
S Objekte mit Arrays Allgemeine Java-Themen 9
F Objekte oder besser ID in Listen speichern? Allgemeine Java-Themen 2
S erzeugte objekte zählen Allgemeine Java-Themen 3
U auf Objekte mit variablem Namen zugreifen Allgemeine Java-Themen 4
Airwolf89 dynamischer Zugriff auf Variablen/ Objekte Allgemeine Java-Themen 4
Landei Objekte ohne Konstruktoraufruf erzeugen Allgemeine Java-Themen 7
E tiefe Kopie nicht serialisierbarer Objekte Allgemeine Java-Themen 3
J Speicherbedarf und persistente Objekte Allgemeine Java-Themen 4
J ArrayList Objekte anhand Propertywerte filtern Allgemeine Java-Themen 3
R Moeglichst viele Datumsstrings in Date Objekte konvertieren? Allgemeine Java-Themen 3
J Eindeutige ID für Objekte als Keys in TreeMap Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben