Klassen-Deskriptoren
Ein ClassDescriptor hält alles, was der Compiler über eine Klasse weiß: Properties, Konstruktoren, Basistypen, Typparameter, Annotationen und Flags.
Properties
Name, Typ und Zugriff
Jeder PropertyDescriptor sagt, ob eine Property gelesen und geschrieben werden kann. Ein var-Parameter ist schreibbar, ein val nicht.
Settings, live
Aus dem Deskriptor der Klasse unten gelesen.
- getProperty("theme")
- java.lang.String, readable true, writeable true
- getProperty("version")
- scala.Int, readable true, writeable false
scala
case class Settings(var theme: String, version: Int)
val descriptor = ReflectMacros.reflect[Settings]
val theme = descriptor.getProperty("theme").get
println(theme.propertyType.typeName)
Case Classes listen mehr als ihre Felder
Der Deskriptor einer Case Class enthält auch die Member, die der Compiler für Product erzeugt: productArity, productPrefix, _1, _2 und so weiter. Brauchst du nur die Felder, geh über die parameterNames des primären Konstruktors.
Struktur
Konstruktoren und Basistypen
Konstruktoren kommen mit ihren Parametern, Basistypen als voll qualifizierte Namen. Beides nutzt die Registry, um Instanzen zu erzeugen und Subtyp-Fragen zu beantworten.
- dog.constructors.head.parameterNames
- name
- dog.baseTypes
- demo.Animal, java.lang.Object, scala.Matchable, scala.Any
- dog.isSubTypeOf("demo.Animal")
- true
- dog.isCaseClass
- false
scala
class Animal(val name: String)
class Dog(name: String) extends Animal(name)
val dog = ReflectMacros.reflect[Dog]