Zum Inhalt springen
Anjunar/ DOCS

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]