Typen auflösen
Jeder Einstieg beginnt bei TypeResolver.resolve. Es nimmt jeden java.lang.reflect.Type, eine einfache Klasse ebenso wie einen parametrisierten Typ oder eine Typvariable, und liefert eine ResolvedClass.
Einstieg
Eine Klasse hinein, ein Modell heraus
name und fullName kommen von der Rohklasse. Das Modell selbst bleibt faul: Member, Hierarchie und Annotationen werden beim ersten Zugriff gelesen.
scala
import com.anjunar.scala.universe.TypeResolver
val resolved = TypeResolver.resolve(classOf[String])
println(resolved.name) // String
println(resolved.fullName) // java.lang.String
println(resolved.raw) // class java.lang.String
Parametrisierte Typen
underlying behält, was raw vergisst
Eine ResolvedClass für List[User] hat zwei Sichten: underlying, der vollständige ParameterizedType, und raw, die gelöschte java.util.List. typeArguments sind selbst ResolvedClasses.
scala
val field = TypeResolver.resolve(classOf[UserRepository]).findField("items")
val list = field.fieldType
println(list.underlying.getTypeName) // java.util.List<example.User>
println(list.raw) // interface java.util.List
println(list.typeArguments.map(_.name).mkString(", ")) // User
Jeder Type
Variablen und Wildcards
rawType löscht jeden Type zu einer Klasse: einen parametrisierten Typ zu seinem Rohtyp, eine Wildcard zu ihrer oberen Schranke. Erst die Auflösung über eine konkrete Unterklasse ersetzt Typvariablen durch echte Typen.
- resolve(aType: Type): ResolvedClass
- Das zwischengespeicherte Modell eines Typs.
- rawType(aType: Type): Class[?]
- Die gelöschte Klasse eines beliebigen Types.
- ResolvedClass.underlying: Type
- Der Type, aus dem dieses Modell aufgelöst wurde.
- ResolvedClass.raw: Class[?]
- Die gelöschte Klasse dahinter.
- ResolvedClass.typeArguments: Array[ResolvedClass]
- Die tatsächlichen Argumente; leer bei einer einfachen Klasse.