Aufgrund der dynamischen Natur von Klassenladern ist dies nicht möglich. Klassenlader sind nicht verpflichtet, der VM mitzuteilen, welche Klassen sie bereitstellen können. Stattdessen werden ihnen lediglich Anforderungen für Klassen übergeben, und sie müssen eine Klasse zurückgeben oder eine Ausnahme auslösen.
Wenn Sie jedoch Ihre eigenen Klassenlader schreiben oder die Klassenpfade und die Jars untersuchen, ist es möglich, diese Informationen zu finden. Dies geschieht jedoch über Dateisystemoperationen und nicht über Reflexion. Vielleicht gibt es sogar Bibliotheken, die Ihnen dabei helfen können.
Wenn es Klassen gibt, die aus der Ferne erzeugt oder geliefert werden, können Sie diese Klassen nicht erkennen.
Die normale Methode ist stattdessen, die Klassen, auf die Sie Zugriff benötigen, irgendwo in einer Datei zu registrieren oder sie in einer anderen Klasse zu referenzieren. Oder verwenden Sie einfach Konventionen, wenn es um die Namensgebung geht.
Nachtrag: Die Bibliothek der Reflexionen ermöglicht es Ihnen, im aktuellen Klassenpfad nach Klassen zu suchen. Es kann verwendet werden, um alle Klassen in einem Paket zu erhalten:
Reflections reflections = new Reflections("my.project.prefix");
Set<Class<? extends Object>> allClasses =
reflections.getSubTypesOf(Object.class);
2 Stimmen
FYI die Lösung Amit Links zu funktioniert, obwohl es einen Fehler hat, wenn der Klassenpfad ein Leerzeichen in es hat (und wahrscheinlich für andere nicht-alphanumerische Zeichen zu). wenn Sie es in jeder Art von Produktionscode verwenden, siehe mein Kommentar zu seiner Antwort für eine Problemumgehung.
2 Stimmen
Beachten Sie auch diese Stelle .
1 Stimmen
Siehe dazugehörige Antwort: stackoverflow.com/a/30149061/4102160
1 Stimmen
Beachten Sie auch diese Stelle .
2 Stimmen
Siehe meine Antwort unten über ClassGraph, es ist derzeit die robusteste Methode zum Scannen der Klassenpfad und Modulpfad.
0 Stimmen
Dies ist ein sehr schwieriges Problem, vor allem wenn man bedenkt, dass nicht alle Classloader müssen dateibasiert sein (ich habe gesehen, wie sie Klassen aus der Datenbank laden) Ihre beste Wette ist wahrscheinlich die Kompilierzeit Annotation Verarbeitung verwenden, um eine Datei von Klassen zur Laufzeit zu verarbeiten. Die meisten Leute, die denken, dass es einfach ist, iterieren über Klassendateien auf Ihrem Klassenpfad - das ist nicht ein großer Ansatz im Allgemeinen, da, wie ich sagte, nicht alle Classloader auf den Klassenpfad beschränkt sind.