Alle Typen (Klassen) eines Packages auslesen
-
Hallo Leute,
ich will alles Typen bzw. Klassen in dem momentan befindlichen Projekt/Packages auslesen. Und entsprechen annotation auselsen. Nach bisschen googeln werden beinahe nur beispiele mit ner Reflection libary gezeigt!? is das so umständlich diese ohne hilfe mit der libary auszulesen?
Grüße Boris
-
Was Du da beschreibst ist praktisch der Kern dessen, was man mit Reflection macht. Insofern: Ja, um Reflection wirst Du da nicht herum kommen. Noch was: Reflection ist hässlich: Umständlich zu benutzen und überall Exceptions mit denen man irgendwie umgehen muss. Andererseits kann man damit auch eine Menge lustiges Zeug treiben.
Ich hatte vor einigen Jahren mal ein Stück Code geschrieben, das mir alle Klassen des Programms zusammensucht und in einen gerichteten Graphen steckt, der die Vererbungshierarchie abbildet. Ich habe das damals genutzt, um mir aus der vorhandenen Klassenstruktur automatisch eine GUI zu generieren. Der Sinn davon war, Algorithmen in einem bestimmten Bereich komfortabel testen zu können, ohne selbst aufwändig eine zugehörige Benutzungsoberfläche erstellen zu müssen. Dafür hatte ich den Code dann auch mit Annotations ausgeschmückt, in denen zum Beispiel die erlaubten Wertebereiche der Parameter und ähnliche Dinge standen.
Wenn Du daran Interesse hast, kann ich das mal raussuchen. Es ist allerdings relativ viel Code. Aber Du hättest zumindest schonmal etwas, was Dir automatisch Deine Klassen in eine vernünftige Datenstruktur steckt.
-
Hi Gregor, danke für deine antwort! aber ich werde es wohl dann uncooler lösen müssen, soviel aufwand möchte ich dann da nich reinstecken..
Aber ich hätte nich gedacht, dass es so schwierig ist einfach nur die Typen eines best. packages auszulesen! wenn ich das mit c# vergleiche, das ja voll der rotz.. in c# is das voll konfortable..
-
Aber in C# kann man das doch auch nur mit Reflection. Oder meinst Du einfach, dass die Reflection-Klassen dort einfacher zu benutzen sind?
-
ja ich hab in c# viel gemacht mit reflections, und bin gut damit klar gekommen! In c# is die geflections geschicht auch in die sprache integriert, und in java braucht man ne extra lib! oder seh ich das falsch?
-
NullBockException schrieb:
ja ich hab in c# viel gemacht mit reflections, und bin gut damit klar gekommen! In c# is die geflections geschicht auch in die sprache integriert, und in java braucht man ne extra lib! oder seh ich das falsch?
Ja eine "extra" lib die da heisst java.lang.reflect
-
NullBockException schrieb:
ja ich hab in c# viel gemacht mit reflections, und bin gut damit klar gekommen! In c# is die geflections geschicht auch in die sprache integriert, und in java braucht man ne extra lib! oder seh ich das falsch?
Reflection ist kein Teil der Sprache* C#, sondern genau wie bei Java in der hauseigenen Bibliothek zu finden.
*abgesehen von Attributen (C#) bzw. Annotations (Java)
-
Achsoooo.. ich ging davon aus, dass Reflectoin bei java keine hauseigene lib ist.. das ändert alles my fault.. danke jungs
-
Hallo nochmal,
ich komm nich an die klassen von einem best. package ran.. in c# geht das ja easy mit
Assembly mscorlib = typeof(string).Assembly; foreach (Type type in mscorlib.GetTypes()) { Console.WriteLine(type.FullName); }
aber ein aquvalent zu java hab ich keins gefunden kann mir jemand helfen?
-
Wenn du irgendwie drum herum kommst, benutz nicht Reflection. Wir wollten vor zwei Monaten alle Klassen auslesen, welche ein bestimmtes Interface implementieren und sind nur schon beim auslesen der Klassen gescheitert... Die Kommentare aus diversen Foren kann ich dir zusammenfassen: Zieh dir Clapper ClassFinder, Apache irgendwas, ach auf Android gehts nicht
Habens dann einfach hartcodiert, weil es ja nur um Klassen in unserem Projekt ging
-
/rant/ schrieb:
Wenn du irgendwie drum herum kommst, benutz nicht Reflection. Wir wollten vor zwei Monaten alle Klassen auslesen, welche ein bestimmtes Interface implementieren und sind nur schon beim auslesen der Klassen gescheitert... Die Kommentare aus diversen Foren kann ich dir zusammenfassen: Zieh dir Clapper ClassFinder, Apache irgendwas, ach auf Android gehts nicht
Habens dann einfach hartcodiert, weil es ja nur um Klassen in unserem Projekt ging
Sooo kompliziert ist das nun auch wieder nicht. Wenn man mal ein bisschen mit Reflection rumgespielt hat, kann man das recht gezielt runterprogrammieren. Aber wenn man um ein "Zieh dir Clapper ClassFinder, Apache irgendwas, ach auf Android gehts nicht" herumkommen moechte, dann muss man eben programmieren koennen und nicht nur makroskopische Bausteine zusammensetzen koennen.