2 - Java Reflection API [ID:31979]
50 von 72 angezeigt

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

Teil einer Videoserie :
Teil eines Kapitels:
Stubs & Skeletons

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

Einbetten
Wordpress FAU Plugin
iFrame
Teilen