我创建了这个扩展方法,该方法从KClass<T>
扩展方法
@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, *> }
}
用法示例
data class Foo(val bar: Int) {
val baz: String = String.EMPTY
var boo: String? = null
}
val properties = Foo::class.getProperties()
结果
val com.demo.Foo.bar:kotlin.Int
val com.demo.Foo.baz:kotlin.String
var com.demo.Foo.boo:kotlin.String?
我将如何修改此扩展方法以仅返回在主构造方法中声明的属性?
预期结果
val com.demo.Foo.bar:kotlin.Int
答案 0 :(得分:2)
您可以通过获取primaryConstructor然后获取valueParameters来获取构造函数参数, 而且由于kotlin类不需要主构造函数,因此我们可以执行以下操作
inline fun <reified T : Any> KClass<T>.getProperties(): Iterable<KParameter> {
return primaryConstructor?.valueParameters ?: emptyList()
}
所以我们是否要询问Foo类的属性
val properties = Foo::class.getProperties()
properties.forEach { println(it.toString()) }
我们会得到
parameter #0 bar of fun <init>(kotlin.Int): your.package.Foo
结果不是KProperty,而是一个KParameter,它可能更适合您的用例
答案 1 :(得分:0)
inline fun <reified T : Any> KClass<T>.getProperties(): List<KProperty<*>> {
val primaryConstructor = primaryConstructor ?: return emptyList()
// Get the primary constructor of the class ^
return declaredMemberProperties.filter {
// Get the declared properties of the class; i.e. bar, baz, boo
primaryConstructor.parameters.any { p -> it.name == p.name }
// Filter it so there are only class-properties whch are also found in the primary constructor.
}
}
总而言之,此函数基本上采用在类中找到的所有属性并对它们进行过滤,以便仅在主要构造函数中找到的 仍然保留。