Sedona

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.


Last update: April 28, 2020