Zum Inhalt springen
Anjunar/ DOCS

Class Loader

Ein ReflectClassLoader hält eigene Deskriptoren und Factories, fragt als Nächstes einen optionalen Elternteil und fällt zuletzt auf die globale Registry zurück.

Subtypen

Nach Namen fragen

Registrierte Deskriptoren tragen ihre Basistypen; der Loader beantwortet Subtyp-Fragen ohne Laufzeitklassen.

loader.isAssignableFrom("demo.Dog", "demo.Animal")
true
loader.getSubTypes("demo.Animal").map(_.simpleName).distinct
List(Animal, Dog, Cat)
loader.createInstanceAs[Dog]("demo.Dog").map(_.name)
Some(Milo)
scala
val loader = ReflectClassLoader.create() loader.register[Animal](ReflectMacros.reflect[Animal]) loader.register[Dog](ReflectMacros.reflect[Dog], () => Dog("Milo")) loader.isAssignableFrom("demo.Dog", "demo.Animal") loader.getSubTypes("demo.Animal")
getSubTypes enthält den Typ selbst

Jeder Typ gilt als sein eigener Subtyp, und ein Typ, der lokal und in der globalen Registry steht, kann doppelt erscheinen. Entferne Duplikate über typeName, wenn du die Ergebnisse auflistest.

Suchreihenfolge

Lokal, Eltern, global

loadClass fragt die eigenen Einträge, dann den Elternteil, dann die globale ReflectRegistry. register veröffentlicht den Deskriptor zusätzlich in der globalen Registry.

child.loadClass("demo.Person").isDefined
true
child.createInstanceAs[Person]("demo.Person")
Some(Person(Ada,37))
ReflectRegistry.contains("demo.Person")
true
scala
val parent = ReflectClassLoader.create() val child = ReflectClassLoader.createWithParent(parent) parent.register[Person](ReflectMacros.reflect[Person], () => Person("Ada", 37)) child.createInstanceAs[Person]("demo.Person") // the parent's factory
Keine Isolationsgrenze

Weil Registrierungen in der globalen Registry landen, sehen jeder Loader und die Registry selbst sie. Nutze Loader für Suchreihenfolge und lokale Factories, nicht, um Typen voreinander zu verbergen.

Ressourcen

Text neben den Typen

ReflectClassLoaderWithResources ergänzt einen Speicher für benannte Strings, etwa ein Schema oder eine Vorlage zu den registrierten Typen.

loader.getResource("person.schema.json")
Some({"title":"Person"})
scala
val loader = ReflectClassLoaderWithResources() loader.addResource("person.schema.json", """{"title":"Person"}""") loader.getResource("person.schema.json")