Ist eine Iteration über alle Klassen innerhalb eines Pakets mit Reflection möglich? [Duplikat]

8

Ich habe einen String mit etwas Wert. Ich möchte über alle Klassen in einem Paket iterieren, indem ich eine bestimmte Methode aufruft, und wenn der Wert, der von der Methode zurückgegeben wird, gleich dem Wert in meiner Zeichenfolge ist, erstelle ein Objekt dieser Klasse.

Ich möchte dies auf dynamische Weise tun. Wenn ich also eine Klasse in dieses Paket einfüge, wird sie automatisch in der Iteration enthalten sein.

Ist das möglich? Wenn nicht, gibt es eine Möglichkeit, das zu tun, was ich möchte?

Ich habe etwas erwartet.

%Vor%     
Renato Dinhani 27.03.2012, 21:44
quelle

3 Antworten

8

Nein, das ist nicht absolut zuverlässig möglich; Es kann jedoch in vielen Fällen sinnvoll sein, sie zu implementieren.

Aufgrund der Flexibilität von Java-Klassenladeprogrammen sind die unter einem bestimmten Paket definierten Klassen zur Laufzeit möglicherweise nicht bekannt (z. B. einen speziellen Klassenlader, der Klassen während des Betriebs definiert, z. B. durch Laden aus dem Netzwerk oder Kompilieren) sie ad-hoc). Daher gibt es keine Standard-Java-API, mit der Sie die Klassen in einem Paket auflisten können.

Praktisch gesehen können Sie jedoch einige Tricks anwenden, indem Sie den Klassenpfad nach allen Klassen- und JAR-Dateien durchsuchen, eine Sammlung vollständig qualifizierter Klassennamen erstellen und diese nach Bedarf durchsuchen. Diese Strategie funktioniert gut, wenn Sie sicher sind, dass sich kein aktiver Klassenlader wie im vorherigen Absatz beschrieben verhält. Zum Beispiel (Java Pseudocode):

%Vor%     
maerics 27.03.2012, 21:47
quelle
2

Ich kann mir zwei Möglichkeiten vorstellen, wie ich das Problem lösen kann, obwohl ich nicht wirklich über alle Klassen in einem Paket iteriere.

Eine besteht darin, eine separate Datei zu erstellen, die Klassen auflistet, auf denen diese spezifische Methode aufgerufen werden soll. Dies ist relativ einfach zu implementieren. Möglicherweise müssen Sie die Datei erstellen, aber das könnte automatisiert werden.

Die zweite Option besteht darin, nach .class-Dateien an einem bekannten Ort zu suchen - z. B. nach einem einzelnen Ordner oder einer Gruppe von Ordnern - und den Namen der Klasse zu erraten und ihn zu laden. Wenn dies ein einfacher Entwicklungsprozess ist, befinden sich die Klassendateien aus einem einzelnen Paket wahrscheinlich in einem einzigen Verzeichnis.

    
Miserable Variable 27.03.2012 23:02
quelle
1

Ja, aber nicht als allgemeine Falllösung. Sie müssen Ihren Code packen und die JVM auf spezifische Weise aufrufen. Insbesondere müssen Sie einen Instrumentierungsagenten erstellen und java.lang.instrument.Instrumentation.getAllLoadedClasses() .

Das Paket Dokumentation für java.lang.instrument enthält viele Details zum Erstellen und Instanziieren eines Agenten.

    
ataylor 27.03.2012 22:07
quelle

Tags und Links