gpt4 book ai didi

properties - Kotlin:如何获取成员属性的委托(delegate)类?

转载 作者:行者123 更新时间:2023-12-05 00:54:48 25 4
gpt4 key购买 nike

如何获取成员属性的委托(delegate)类?

通过这个,我的意思是有可能完成这样的功能:

inline fun <reified T> delegationExample(t: T) {
for (prop in T::class.declaredMemberProperties) {
val delegatedClass = // what to do?!
}
}

委托(delegate)类可能如下所示:
class DelegationExample {
operator fun getValue(ref: Any, prop: KProperty<*>) = 0
}

声明类可能如下所示:
object Example {
val a by DelegationExample()
val b by DelegationExample()
val c by DelegationExample()
}

最佳答案

要查找委托(delegate)给委托(delegate)类的属性以及该类的实例,这里有一个实用函数:

data class DelegatedProperty<T : Any, DELEGATE : Any>(val property: KProperty1<T, *>, val delegatingToInstance: DELEGATE)

inline fun <reified T : Any, DELEGATE : Any> findDelegatingPropertyInstances(instance: T, delegatingTo: KClass<DELEGATE>): List<DelegatedProperty<T, DELEGATE>> {
return T::class.declaredMemberProperties.map { prop ->
val javaField = prop.javaField
if (javaField != null && delegatingTo.java.isAssignableFrom(javaField.type)) {
javaField.isAccessible = true // is private, have to open that up
@Suppress("UNCHECKED_CAST")
val delegateInstance = javaField.get(instance) as DELEGATE
DelegatedProperty(prop, delegateInstance)
} else {
null
}
}.filterNotNull()
}

几点注意事项:
  • 首先更正你的具体化类型TT: Any或者您无法访问 Kotlin 反射中的所有扩展,包括 declaredMemberProperties
  • 最简单的方法是从属性引用中获取该字段,以确保您实际上在谈论真正是属性的东西,因此对于 declaredMemberProperties 中的每一个使用 javaField这样做。
  • 由于javaField是一个自定义 getter 并且可以为空,它被保存到一个局部变量中,因此智能转换将在以后工作。
  • 然后,如果此字段与您要查找的委托(delegate)类具有相同的类型,则您可以访问该字段。
  • 但首先你必须强制该字段的可访问性,因为它是 private field 。

  • 在测试程序中运行它:
    class DelegationExample {
    operator fun getValue(ref: Any, prop: KProperty<*>) = 0
    }

    class Example {
    val a by DelegationExample()
    val b by DelegationExample()
    val c by DelegationExample()
    }

    fun main(args: Array<String>) {
    findDelegatingPropertyInstances(Example(), DelegationExample::class).forEach {
    println("property '${it.property.name}' delegates to instance of [${it.delegatingToInstance}]")
    }
    }

    输出类似于:
    property 'a' delegates to instance of [DelegationExample@2c1b194a]
    property 'b' delegates to instance of [DelegationExample@4dbb42b7]
    property 'c' delegates to instance of [DelegationExample@66f57048]

    关于properties - Kotlin:如何获取成员属性的委托(delegate)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39421593/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com