Registry
ReflectRegistry ist eine globale Zuordnung von Typnamen zu Deskriptoren. Registriere einen Typ einmal und suche, erzeuge und prüfe ihn danach über seinen Namen.
Registrieren
Mit Accessoren und Factory
register reflektiert den Typ mit Accessoren, bindet Laufzeitklasse und Factory und legt ihn unter vollem und einfachem Namen ab.
- ReflectRegistry.loadClass("demo.Query").map(_.simpleName)
- Some(Query)
- ReflectRegistry.loadClassBySimpleName("Query").isDefined
- true
- ReflectRegistry.createInstance("demo.Query")
- Some(Query(select * from dual))
- ReflectRegistry.getPropertyAccessor("demo.Query", "sql").isDefined
- true
scala
import reflect.ReflectRegistry
ReflectRegistry.register(() => Query("select * from dual"))
ReflectRegistry.loadClass("demo.Query")
ReflectRegistry.createInstance("demo.Query")
ReflectRegistry.getPropertyAccessor("demo.Query", "sql")
Andere Einträge
Selbst gebaute Deskriptoren
registerByTypeName legt einen beliebigen Deskriptor ab, etwa einen mit gebundener Laufzeitklasse und Factory.
scala
val descriptor = ReflectMacros.reflect[Query]
ReflectRegistry.registerByTypeName(
descriptor.typeName,
descriptor.bindRuntimeClass(classOf[Query]).bindFactory(() => Query("select 1"))
)
Globaler Zustand
Die Registry lebt so lange wie das Programm. Tests, die Typen registrieren, sollten ReflectRegistry.clear() aufrufen; Code, der Isolation braucht, nimmt einen ReflectClassLoader.