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.
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)
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.
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
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.
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"})