gpt4 book ai didi

reflection - memberProperty returnType 父类(super class)的类型检查失败

转载 作者:行者123 更新时间:2023-12-02 13:23:14 26 4
gpt4 key购买 nike

我有一个对象的实例,我会扫描其上附有适当注释的 memberProperties。然后,我想根据它们的返回类型进行过滤。
例如,如果声明如下:class AutoValidatedThing : AutoValidatedUserInputComponent {...}并且目标实例包含 @ValidComponent val someProperty: AutoValidatedThing = ... , 我想得到 someProperty作为 AutoValidatedUserInputComponent到以下代码块的末尾:

    val invalidOnes = this::class.memberProperties
.filter { it.javaField != null && it.javaField!!.isAnnotationPresent(ValidComponent::class.java) }
.filter { val annotations = it.javaField?.annotations; annotations != null
&& annotations.map { ann -> ann.annotationClass }.contains(ValidComponent::class)
&& it.returnType is AutoValidatedUserInputComponent }
.map { it.getter.call() as AutoValidatedUserInputComponent }

但是 it.returnType is AutoValidatedUserInputComponent总是返回假。
AutoValidatedUserInputComponent是一个简单的界面:
interface AutoValidatedUserInputComponent {
fun blabla() : SomeType
}

最佳答案

调用 returnType KProperty不返回具有给定类型的实例,您可以执行 is检查 - 它返回一个描述类型的反射类,特别是 KType ,这当然不会实现你的接口(interface)。而不是使用 is ,您可以调用 isSubTypeOf 在它上面,并检查它是否是另一个给定 KType 的子类型.

对于该电话,您需要获得 KType对于您自己的界面 - 为此,您可以使用 createType 在其KClass :

val targetType = AutoValidatedUserInputComponent::class.createType(nullable = true)

可空性部分由您决定, createType 还有其他可选参数,例如,如果您的接口(interface)碰巧有类型参数。

然后,正如我提到的,您可以使用 isSubTypeOf :
val invalidOnes = this::class.memberProperties
.filter { it.javaField != null && it.javaField!!.isAnnotationPresent(ValidComponent::class.java) }
.filter {
val annotations = it.javaField?.annotations
annotations != null
&& annotations.map { ann -> ann.annotationClass }.contains(ValidComponent::class)
&& it.returnType.isSubtypeOf(targetType)
}
.forEach {
println("Found field with annotation and given supertype: $it")
}

关于reflection - memberProperty returnType 父类(super class)的类型检查失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51122740/

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