ReflectionFactory

Generic1

Top Contributor
Hallo,

versteht jemand die folgenden Zeilen:

Java:
public static <T> T create(final Class<T> clazz, final Class<? super T> parent) {
        try {
            final ReflectionFactory rf = ReflectionFactory.getReflectionFactory();
            final Constructor objDef = parent.getDeclaredConstructor();
            final Constructor intConstr = rf.newConstructorForSerialization(clazz, objDef);
            return clazz.cast(intConstr.newInstance());
            }
        catch (final RuntimeException e) {
            throw e;
            }
        catch (final Exception e) {
            throw new IllegalStateException("Cannot create object", e);
            }
        }

in der ersten Zeile wird eine ReflectionFactory erzeugt, das kann ich mir noch erklären.
parent.getDeclaredConstructor(); ist mir schon ein Rätsel, vor allem was ein Constructor- Object sein soll ist mir nicht klar,
mit newConstructorForSerialization wird dann nochmal ein Constructor- Object geholt (warum auch immer) und dann wird eine neue Instance eines Objects erzeugt.
Wäre dankbar für eine Erklärung, durchschau den Code momentan noch nicht.
Besten Dank,
 

Murray

Top Contributor
Grundsätzlich geht es hier darum, zur Laufzeit ein Objekt zu erzeugen, dessen Typ zur Entwicklungszeit noch nicht bekannt ist. Die dazu notwendigen Techniken werden meist mit Reflection bezeichnet.

Grundsätzlich sind in Java auch Klassen sowie die darin deklarierten Methoden (was Konstruktoren einschließt) Objekte. Diese können zur Laufzeit wie andere Objekte auch verwendet werden. So kann man z.B. von einer Klasse erfragen, welche Methoden darin deklariert sind. Diese Methoden kann man dann auch aufrufen. Und genau das passiert hier mit dem Konstruktor, so dass am Ende eine neue Instanz einer Klasse entsteht, die eben erst zur Laufzeit festgelegt wurde.

Was im Detail passiert und warum, erschließt sich ohne Kenntnis der Klasse RefelctionFactory nicht so ohne weiteres.
 
S

SlaterB

Gast
für Serialisierung braucht man parameterlose Konstruktoren, denn welche Parameter sollte man übergeben?

für mich klingt es so, als wird befürchtet, dass die Klasse clazz keinen parameterlosen Konstruktor hat,
für die Parent-Klasse ist dies aber vorausgesetzt:
parent.getDeclaredConstructor() wirft sonst eine Exception

mit rf.newConstructorForSerialization(clazz, objDef); wird nun anscheinend der benötigte Standard-Konstruktor nachträglich erzeugt



sun.reflect: ReflectionFactory.java
 

Oben