Reflection¶
Overview¶
Despite its tiny runtime footprint, the Sedona Framework has powerful reflection support for accessing kit, type, and slot meta-data at runtime. However unlike the general purpose reflection found in Java, Sedona reflection is only supported for Component types and Property/Action slots.
Kits¶
You can access the installed kits with the sys::Kit class:
// iterate over the installed kits
foreach (Kit kit : Sys.kits, Sys.kitsLen)
Sys.out.print("$kit.name $kit.version ${Sys.hexStr(kit.checksum)}").nl()
// look up a kit by name
Kit kit = Sys.findKit("sys")
Types¶
The sys::Type API is used to reflectively work with
types at runtime. Only types that extend from Component
are available
for reflection:
// walk the types installed in a given kit
Kit kit = Sys.findKit("control")
foreach (Type t : kit.types, kit.typesLen)
Sys.out.print(" ${kit.name}::${t.name}").nl()
// lookup a type by qname
Type t = Sys.findType("control::Ramp")
// type literal for class User
Type t = User.type
If you know the type you need at compile time, you should use type literals since they are most efficient:
UserService s = (UserService)Sys.app.lookupService(UserService.type)
Slots¶
The sys::Slot API is used to reflectively work with slots at runtime. Only the property and action slots of component types are available for reflection:
// walk a type's slots
Type t = App.type
foreach (Slot slot : t.slots, t.slotsLen)
Sys.out.print(" ${slot.name}: $slot.type.name").nl()
// lookup a slot by name
Slot restart = t.findSlot("restart")
// slot literal for the App action "restart"
Slot restart = App.restart
If you know the slot you need at compile time, you should use slot literals since they are most efficient.
Ids¶
Note that Kit
, Type
, and Slot
each have an id
field, which is a
direct index into the corresponding array:
Id Field | Index Into |
---|---|
Kit.id | Sys.kits |
Type.id | Kit.types |
Slot.id | Type.slots |
This is an extremely efficient way to lookup kits, types, and slots. However, be aware that the id lookup only works within a specific schema. As soon you change the installed kits or the version of those kits, then all of the reflection ids will likely change. This trade-off between the efficiency of id based lookup versus the ability to version kits is the basis of Schemas.