Zum Inhalt springen
Anjunar/ DOCS

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.

1.0.4Aktuelle Version
JVMLäuft auf
Scala 3.3Sprachversion
MITLizenz

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.

sbt
libraryDependencies += "com.anjunar" %% "scala-universe" % "1.0.4"

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].

scala
import com.anjunar.scala.universe.TypeResolver abstract class Repository[E] { var items: java.util.List[E] = new java.util.ArrayList[E]() } class UserRepository extends Repository[User] val repository = TypeResolver.resolve(classOf[UserRepository]) val items = repository.findField("items").fieldType println(items.name) // List println(items.typeArguments(0).name) // User
01 / Auflösen

Ein Modell pro Typ

TypeResolver macht aus jedem java.lang.reflect.Type eine zwischengespeicherte ResolvedClass: Rohklasse, Typargumente und Hierarchie.

02 / Binden

Generics aus Sicht der Unterklasse

Feld-, Rückgabe- und Parametertypen geerbter Member werden gegen den Typ aufgelöst, von dem du ausgegangen bist.

03 / Beschreiben

Properties statt Member

Bean- und Annotations-Introspektoren fassen Feld, Getter und Setter zu einer Property mit den Annotationen aller drei zusammen.

Wo es eingesetzt wird

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.

Inhalt

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.