ReflectionEnable runtime type information (RTTI) for a class:

Reflection

@reflect

Enable runtime type information (RTTI) for a class:

@reflect
class Entity {
    var id: Int
    var name: String
    var health: Float
}

The @reflect decorator generates metadata that can be queried at runtime.

API

import core.reflect
Function Signature Description
reflectHasField (fieldNames: Array<String>, name: String) r: Bool Check if field exists
reflectFieldIndex (fieldNames: Array<String>, name: String) r: Int Get field index (-1 if not found)

Usage

@reflect
class Player {
    var name: String
    var score: Int
    var level: Int
}

fun main() {
    let player = Player { name: "Alice", score: 100, level: 5 }

    // Get field names
    let fields = player.fieldNames()
    for field in fields {
        println("Field: {field}")
    }
    // Output:
    //   Field: name
    //   Field: score
    //   Field: level

    // Check field existence
    if reflectHasField(fields, "score") {
        let idx = reflectFieldIndex(fields, "score")
        println("score is at index {idx}")
    }
}

Combining with @derive

Reflection works well with derive macros:

@reflect
@derive(Debug, Clone, Json)
class Config {
    var name: String
    var port: Int
    var debug: Bool
}

fun main() {
    let config = Config { name: "app", port: 8080, debug: true }

    // Reflection
    let fields = config.fieldNames()
    println("Fields: {fields.length()}")

    // Debug (from @derive(Debug))
    println(config.debug())

    // JSON (from @derive(Json))
    println(config.toJson())
}

Limitations

  • Reflection only provides field names, not field types at runtime
  • Only works on classes decorated with @reflect
  • Field access is by index, not by name (use reflectFieldIndex to map)
Architected in Kotlin. Rendered with Materia. Powered by Aether.
© 2026 Yousef.?