Warm tip: This article is reproduced from serverfault.com, please click

get all properties from primary constructor

发布于 2019-02-16 19:47:14

I have created this extension method which gets all properties from a KClass<T>

Extension Method

@Suppress("UNCHECKED_CAST")
inline fun <reified T : Any> KClass<T>.getProperties(): Iterable<KProperty1<T, *>> {
    return members.filter { it is KProperty1<*, *> }.map { it as KProperty1<T, *> }
}

Example Usage

data class Foo(val bar: Int) {
    val baz: String = String.EMPTY
    var boo: String? = null
}

val properties = Foo::class.getProperties()

Result

val com.demo.Foo.bar: kotlin.Int

val com.demo.Foo.baz: kotlin.String

var com.demo.Foo.boo: kotlin.String?

How would I modify this extension method to only return properties that are declared in the primary constructor?

Expected Result

val com.demo.Foo.bar: kotlin.Int

Questioner
Matthew Layton
Viewed
0
szymon_prz 2019-02-17 05:40:29

You can take constructor parameters by getting primaryConstructor and then valueParameters, and because primary constructor is not required for kotlin class we can do something like this

inline fun <reified T : Any> KClass<T>.getProperties(): Iterable<KParameter> {
   return primaryConstructor?.valueParameters ?: emptyList()
}

so if we will ask for properties of Foo class

val properties = Foo::class.getProperties()
properties.forEach { println(it.toString()) }

we will get

parameter #0 bar of fun <init>(kotlin.Int): your.package.Foo

and the result is not a KProperty, but a KParameter which may be more aligned to your use case