Reflektion
-
Hallo !
Wie kann ich herausfinden, welche Subklassen eine bestimmte Klasse hat... sieht so aus, als ob es in Java keine (Standard-)Möglichkeit gäbe, dies herauszufinden. Superklassen haben dann also keine Ahnung davon, von welchen Klassen sie erweitert werden. Ich habe mir alle nützlichen Klassen wie Class, ClassLoader, Object etc. angeschaut, jedoch keine plausible Methode gefunden, die die existierenden Subklassen einer Klasse zurückgibt. Im Web habe ich ein paar Schnittstellen wie ReflectionUtil etc. gefunden, in JDK jedoch irgendwie keine Spur von getSubclasses() oder ähnlichem. Ich kann es mir eigentlich nicht vorstellen, dass es nicht geht...
-
Eine direkte Möglichkeit kann es im Prinzip garnicht geben. Denn eine Klasse weiß ja nicht, was alles an Subklasse eventuell noch dazu programmiert werden kann. Im übrigen können die Subkalssen quer über den ganzen Klasspath verstreut sein oder auch in Verzeichnissen die noch nicht im Classpath sind.
Eine Klasse kennt nur ihre Oberklasse, du könntest also maximal alle vorhandenen Klassen abchecken, ob sie eine ganz bestimmte Oberklasse haben.
-
Zufälligerweise habe ich gerade ein ähnliches Problem. Ich löse das dadurch, dass ich beim Programmstart alle vorhandenen Klassen (meines Projekts) in einen gerichteten Graph stecke, der die Vererbungshierarchie wiederspiegelt.
...damit kann ich dann natürlich schnell die jeweiligen Subklassen einer Klasse herausfinden.
-
Hallo Gregor !
ja ich weiß.. ist schwierig, aber ich denke mal, dass es eine sehr wichtige Information ist ! Und bei manchen Programmiersprachen funktioniert der Mechanismus anscheinend besser, wie z.B. die XOTcl oder (angeblich) Smalltalk (http://www.informatik.haw-hamburg.de/~java98/ss98/Abschlussberichte/Reflektion/Dokumentation/Reflektion.pdf
). Ich war heute schon ziemlich verzweifelt, weil ein Paar Java-Kiddies bei mir mit einer Hausaufgabe waren, .."es soll eine Methode programmiert werden, die per Zufall eine Subklasse auswählt und eine Instanz dieser zurückgibt". Also die einzige Lösung, ohne zusätzlich Packages installieren zu müssen oder eine müheselige Erweiterung proggen zu müssen, war einfach hartkodieren... Ziemlich blöde Geschichte ... wenn man bedenkt, es soll sich da um eine "Einführung in das OO Programieren" handeln.
-
Eine Methode getSubClass wird es wohl nicht geben...
es soll eine Methode programmiert werden, die per Zufall eine Subklasse auswählt und eine Instanz dieser zurückgibt
Steht in der Angabe auch, dass die Namen der Subklassen nicht irgendwo als String oder in einer Lister gespeichert werden dürfen?
-
Hallo Kati,
es ist definitiv nicht möglich nur anhand einer .class-Datei herauszufinden welche Klassen von dieser Klasse abgeleitet wurden. Um dies machen zu können ist immer ein bekanntes Package notwendig, das analysiert werden kann. So macht es beispielsweise auch das javadoc-Tool. Einfach alle Klassen durchgehen und merken wer von wem abgeleitet wurde und als "Direct Known Subclasses" ablegen. Du brauchst also immer eine bekannte Menge von Klassen.
Was natürlich auch sein kann (was ich aber nicht unterstellen möchte):
Sub- und Superklasse hören sich schon ähnlich an. Vielleicht wird da was verwechselt? Die Superklassen können via Reflection aufgelistet werden. Das könnte man auch ausnutzen und den Spieß einfach umdrehen.[ Dieser Beitrag wurde am 12.06.2003 um 09:23 Uhr von CengizS editiert. ]
-
@Destructor: NEIN ! Es gibt keine Hashtable oder eine andere Art Container, wo du diese Inf. herkriegst !
@Cengiz: NEIN ! Ich war die Aufgabe 100 Mal gelesen. Die ganze Aufgabe war ein bisschen gestört. Und zu diesem Problem: es soll zunächst eine Klasse Kunstgegenstand programmiert werden, die ein Standardverhalten definiert und auch noch eine Methode "randArt()", die aus den Subklassen dieser Klasse - nämlich
Gemaelde, Skulptur und Komposition
eine Klasse per Zufall auswählt und eine Instanz erzeugt. Also wenn ich jetzt die drei hardcodiere und dann eine weitere Subklasse, z.B. Bildhauereidingsbums definiere, stimmt das ganze nicht mehr...
public Kunstgegenstand randArt() { Random r = new Random(); final int number = 3; //anstatt einer Konstante die Subklassen zur Laufzeit auslesen int artnumber = r.nextInt(number); Kunstgegenstand k; switch(artnumber) { case 0: k = new Gemaelde(); break; case 1: k = new Skulptur(); break; case 2: k = new Komposition(); break; default: k = null; } return k; }
ok, also es geht nicht und man muss sich selbst drum kümmern, wenn man diese Inf irgendwann mal braucht.