Reflection

Bonsai

Bekanntes Mitglied
Hallo Community,

ich habe bisher noch nichts mit reflections getan, daher hoffe ich das ihr mir weiterhelfen könnt. Mein Problem ist folgendes: Ich habe mir ein Interface erstellt, welches ich in mehreren Klassen implementiere. nachdem ich die klassen erstellt habe, möchte ich gern die einzelnen klassen in einem Array des Interfaces aufrufen. Dies sieht bei mir bis jetzt wie folgt aus:

Java:
InterfaceName[] inter = {new Klasse1, new Klasse2, new Klasse3, new Klasse4,...}

Zur zeit muss ich immer wenn ich eine neue Klasse erstelle, auch einen neuen eintrag in dem Array für die erstellte Klasse tätigen. Ich habe gehört das man dies durch Reflections automatisieren kann, dass ich sozusagen nur die Klasse erstellen brauch diese dann automatisch in dem Array instanziert wird. Könnt ihr mir eventuell sagen wie ich das machen kann?

Gruß
Bonsai
 
M

modularity

Gast
Da das ganze wohl in die Richtung "modulares System" gehen soll würde ich sagen : falscher Ansatz. Hier mit Reflections rumzuspielen kann den Code ganz schön durch ein ander bringen. Arbeite lieber mit ner List oder ner Map und lade die Module nach möglichkeit dynamisch mit nem URLClassLoader.
Wenn ich jetzt daneben liegen solltest du mal eher erklären was du eigentlich vorhast weil so ist das Ganze aus dem Kontext gerissen und man kann nicht sagen welche Nebenwirkungen Reflections hier haben.


Reflections sind nun mal ein sehr mächtiges Werkzeug und werden viel intern von der VM verwendet. Man sollte nicht so leichtfertig damit umgehen was man nicht auch z.B. mit einer List oder der gleichen machen kann.

Hinzu kommt das ein Array eine fixe Größe hat. Du müsstest also eine neues Array mit der passenden Größe erstellen, den Inhalt des alten kopieren und dann das neueste Element hinten anfügen. Ansonsten läufst du eh in eine Menge Exceptions.
 

Bonsai

Bekanntes Mitglied
Also ich erstelle gerade ein Plugin, welches Java-Code auf bestimmte Regeln hin überprüfen soll. Dabei iste jede Klasse eine Regel. Damit ich alle Regeln ausführen kann, benötige ich sie an einem zentralen Punkt. In meinem Fall ist dies das Array, damit ich eine nach der anderen Regel abarbeiten kann. Dabei soll das Tool zukünftig modular sein, damit eigene Regeln hinzugefügt werden können, ohne jetzt großartig durch den Code springen zu müssen, damit man alle benötigten Änderungen umsetzten muss. Deshalb wollte ich, dass wenn man eine Klasse schreibt, welche mein Interface implementiert, automatisch aufgerufen, bzw zu dem Array hinzugefügt wird, damit eben der Anwender sich nicht erst durch den Code wursteln braucht, sondern es genügt, wenn er seine Klasse erstellt, und der Rest vom System übernommen wird.
 

Bonsai

Bekanntes Mitglied
wenn ich das mit dem serviceloader machen würde, müsst ich doch die namen der klassen kennen oder? Den namen kennt mein tool aber ja nicht, wenn neue klassen hinzugefügt werden. Oder seh ich das falsch?
 
S

Spacerat

Gast
wenn ich das mit dem serviceloader machen würde, müsst ich doch die namen der klassen kennen oder? Den namen kennt mein tool aber ja nicht, wenn neue klassen hinzugefügt werden. Oder seh ich das falsch?
Das siehst du falsch. Du müsstest nur den Namen der abstrakten Providerklasse (in diesem Fall würde sich "Rule" anbieten) kennen. Der konkrete Klassenname steht dann im Archiv des konkreten Rule-Providers in den META-INFs (Ordner "service").
Wenn du aber nicht vorhast, die ganze JVM immer neu starten zu müssen, wenn eine Regel hinzu kommt, wegfällt oder gar grad' erstellt wurde (maw. "on the fly" erstellt also dynamisch sind), ist auch das SPI ungeeignet. Dann wäre evtl. ein ähnlicher Mechanismus vorzuziehen, der dir konkrete Rules liefert, die z.B. per XML oder ähnlichem konfiguriert wurden.
[EDIT][OT]... da fällt mir ein... bekommt man beim SPI eigentlich auch mehrere Provider (in diesem Falle Rules) in ein einziges Paket?[/OT][/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
M

modularity

Gast
Also bei allem was in die Richtung "Plugin-System" / "modulares System" geht würde ich entweder OSGi empfehlen (obwohl ich mich damit selbst noch nie befasst habe) oder etwas ganze einfaches selbstgebautes :
Die "Plugins" jeweils in eigenes Jar (ob man nun ServiceLoader mäßig META-INF/services nutzt, im Manifest die Main-Class oder sich eine eigene Datei reinlegt ist egal) und das ganze dann via URLClassLoader laden und in eine ArrayList<Plugin> packen. Die kannst du wie ein normales Array durchgehen (verwendet intern ein Array) ist aber durch den inneren Aufbau so nicht direkt in ihrer Größe fix sondern variable (man sollte schon mal mit Collections gearbeitet haben wenn man sowas vor hat).

Dank Java7 (geht auch mit nem "Hack" in Java6) kann man diese Plugins auch wieder "entladen" da URLClassLoader seit Java7 endlich Closeable implementiert. Das ganze kann man unter Java6 aber selbst nach bauen und es funktioniert trotzdem.

SPI hat hier halt zwei Nachteile :
1) alle Plugins die "automatisch" geladen werden sollen müssen im CLASSPATH liegen
2) "Entladen" geht so nicht da man dafür mit Reflections im SystemClassLoader rumspielen müsste

Beispiele gibt es hier und im Netz genug.
 
S

Spacerat

Gast
[OT]
1) alle Plugins die "automatisch" geladen werden sollen müssen im CLASSPATH liegen.
2) "Entladen" geht so nicht da man dafür mit Reflections im SystemClassLoader rumspielen müsste
Diese Information ist absolut falsch -> [c]ServiceLoader.load(ServiceProvider.class, myURLClassLoader)[/c]
Damit lassen sich PIs auch ohne Reflections wieder entladen, indem man den gesamten ClassLoader dem GC überlässt. Natürlich vorrausgesetzt, dass es keine Instanzen der verwendeten PIs mehr gibt. ;)[/OT]
 
Zuletzt bearbeitet von einem Moderator:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Reflection: Suche Feld + in Unterklassen Java Basics - Anfänger-Themen 7
B Reflection ändern von Objekten in Objekten Java Basics - Anfänger-Themen 12
G Vererbung Sicherheitslücke? Reflection sieht members, die nicht sichtbar sein sollten?! Java Basics - Anfänger-Themen 11
S reflection und felder Java Basics - Anfänger-Themen 12
B .class-File mit Reflection auslesen Java Basics - Anfänger-Themen 8
X Parameterübergabe per Reflection Java Basics - Anfänger-Themen 10
U Reflection Benutzung Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 6
S Datentypen Reflection Cast anhand eines Strings? Java Basics - Anfänger-Themen 7
X reflection api Java Basics - Anfänger-Themen 5
R Alle Klassen ermitteln, die Interface implementieren / Reflection Java Basics - Anfänger-Themen 51
lumo java reflection Java Basics - Anfänger-Themen 7
J Reflection Java Basics - Anfänger-Themen 2
J Reflection Java Basics - Anfänger-Themen 3
P Reflection - Class Not Found Exception Java Basics - Anfänger-Themen 3
A Frage zu Reflection Java Basics - Anfänger-Themen 8
A abgeleitete Klassen mit Reflection holen Java Basics - Anfänger-Themen 2
M Reflection Java Basics - Anfänger-Themen 8
W Problem bezüglich reflection Java Basics - Anfänger-Themen 11
S verschiede constructoren über reflection Java Basics - Anfänger-Themen 3
V Reflection API - getter und setter Java Basics - Anfänger-Themen 7
JFeel-x Frage zu reflection Java Basics - Anfänger-Themen 12
J Reflection Basic Java Basics - Anfänger-Themen 26
C Reflection Exceptions behandeln Java Basics - Anfänger-Themen 6
T von Reflection zum Thread? Java Basics - Anfänger-Themen 5
G Vorteile Reflection bezüglich MVC-Pattern Java Basics - Anfänger-Themen 9
G Reflection - Klasse laden aus anderem Verzeichnis Java Basics - Anfänger-Themen 4
L Reflection-fehlermeldung Java Basics - Anfänger-Themen 12
E Klassenaufrufe dynamisch mit Reflection Java Basics - Anfänger-Themen 4
S wer oder was ist reflection? Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben