Hallo zusammen! Um in Aufgabe 2 generische Stubs und Skeletons implementieren zu können,
braucht es eine Möglichkeit, zur Laufzeit dynamische Methoden aufzurufen, ohne sie vorher
zu kennen. Dies erlaubt uns in Java die Reflections API.
Die Java Reflection API erlaubt es, das Laufzeitverhalten von Applikationen zu analysieren und eben
auch es zu beeinflussen. Das ist natürlich ein relativ mächtiges Feature und sollte
damit mit etwas Vorsicht behandelt werden. Man kann sein Programm damit ganz schön kaputt
machen und es vor allem kaum nachvollziehen. Im offiziellen Tutorial von Oracle wird daher
auch vorgewarnt, dass man Reflection nur dann verwenden sollte, wenn man sich mit Java auskennt
und es zudem auch nicht übermäßig verwenden soll. Auch wenn es manchmal fast zum zu praktisch
erscheint. Wenn man etwas ohne Reflection lösen kann, sollte man das tun.
Reflection beeinträchtigt zum Beispiel die Performance. Dabei von Reflection aufgerufene
Methoden nicht alle von der JVM-Angebote in Optimierung funktionieren. Zudem lassen sich
damit auch eigentlich illegale Aktionen ausführen, wie zum Beispiel der Zugriff auf eigentlich
als privat deklarierte Felder. Wenn richtig angewendet, ermöglicht einem
die Reflection API aber auch viele praktische Features, wie die Analyse von Objekten oder
Methoden, das dynamische Erzeugen oder Modifizieren von Objekten und eben auch dynamische Methoden
auf Profil, wie wir sie für unsere Generischen Stubs und Saladins brauchen. Reflections
ist dafür für die Übung das Mittel der Wahl.
Einen Teil von Reflection, den die meisten wahrscheinlich schon auf die eine oder andere
Weise verwendet haben, sind Glasoobjekte. Sie erlauben es zur Laufzeit festzustellen,
von welchem Typ ein Objekt ist. Dieses Glasoobjekt ist aber für jeden Typ ein unveränderliches
Objekt. Alle Objekte eines Typs haben also dasselbe Glasoobjekt. Unabhängig davon,
ob es sich um eine Klasse oder um einen primitiven Datentyp handelt, sind hier also Referenzvergleiche
möglich mit istgleich istgleich. Um das Glasoobjekt zu bekommen, gibt es drei
Möglichkeiten. Erstens, allgemein per Punkt-Class-Attribut eines Typs oder auch einer Klasse. Dafür
braucht man keine Instanz des jeweiligen Typs und es funktioniert auch für primitive Datentypen.
Ein In-Punkt-Class geht also auch. Ansonsten kann man das Glasoobjekt auch direkt von einem
referenzierten Objekt bekommen. Das ist besonders bei Verabung praktisch, wenn man nicht genau
weiß, von welchem speziellen Typ ein Objekt jetzt genau ist. Objekte bieten dafür die
Methode getClass an.
Als dritte Möglichkeit gibt es die statische Methode forName, die class.direct anbietet,
die den Namen der Klasse als Stringparameter erwartet. Das ist zum Beispiel dann praktisch,
wenn man eine Klasse ohne spezifisches Objekt, aber dynamisch, zum Beispiel abhängig von
einem Parameter braucht.
Nachdem man die Klasse eines Objekts herausgefunden hat, kann man dieses Glasoobjekt verwenden,
um diverse Informationen über die jeweilige Klasse zu erhalten. So kann man mit getSuperClass
auf die Oberklasse zugreifen und sich theoretisch so die Klassenhierarchie bis zu Object hochhangeln.
Äquivalent dazu bekommt man mit getInterfaces alle Schnittstellen, die diese Klasse implementiert.
Hier aber wichtig, getInterfaces liefert nur die Schnittstellen zurück, die direkt implementiert
werden, nicht die von Oberklassen. Mit getMethods bekommt man dann alle wieder direkt öffentlichen
Methoden dieser Klasse.
Mit Hilfe dieser drei Methoden kann man sich zum Beispiel alle Methoden aller Schnittstellen
eines Objektes, egal ob selbst implementiert oder in einer Oberklasse, ausgeben lassen.
Mit getSuperClass kann man in einer Schleife die gesamte Klassenhierarchie durchlaufen.
Für jede dieser Klassen und Oberklassen holt man sich dann mit getInterfaces alle Schnittstellen
und dann mit getMethods für jede Schnittstelle alle Methoden. Diese kann man einfach ausgeben.
Auf ganz ähnliche Art und Weise lassen sich dann auch Methodobjekte analysieren, die
eine Methode repräsentieren.
Hier bietet uns Reflection diverse getMethoden, unter anderem um den Namen, die Parametertypen,
den Typ vom Rückgabewert und die geworfenen Exceptions zu erhalten. Auch bekommt man mit
Presenters
Zugänglich über
Offener Zugang
Dauer
00:05:35 Min
Aufnahmedatum
2021-04-29
Hochgeladen am
2021-04-29 16:47:01
Sprache
de-DE
Einführung in die Java Reflection API