Scala Universe
Eine strukturierte Sicht auf Klassen zur Laufzeit. Typen werden einmal aufgelöst, Generics an die konkrete Unterklasse gebunden, und Felder, Methoden und Annotationen teilen ein Modell.
Installation
Ein Artefakt für die JVM. Es bringt Guavas TypeToken für die Generics-Auflösung und die CDI-API für die optionale Klassenpfad-Erweiterung mit.
Der generische Typ, den Java vergisst
Das Feld ist in der Basisklasse als List[E] deklariert. Über die Unterklasse aufgelöst, ist es eine List[User].
Ein Modell pro Typ
TypeResolver macht aus jedem java.lang.reflect.Type eine zwischengespeicherte ResolvedClass: Rohklasse, Typargumente und Hierarchie.
Generics aus Sicht der Unterklasse
Feld-, Rückgabe- und Parametertypen geerbter Member werden gegen den Typ aufgelöst, von dem du ausgegangen bist.
Properties statt Member
Bean- und Annotations-Introspektoren fassen Feld, Getter und Setter zu einer Property mit den Annotationen aller drei zusammen.
Die Typschicht von json-mapper
json-mapper löst jede Klasse über TypeResolver auf, liest @JsonbProperty-Member über AnnotationIntrospector und findet Schemas über companionInstance. Alles, was ein Framework auf einfachen Klassen baut, kann das genauso.
Vom Typ zu seinen Properties
Die Typ-Seiten bauen das Modell auf, die Member-Seiten zeigen, was darin steckt, die Introspektions-Seiten machen daraus Properties, und die Praxis-Seiten setzen es ein.