gpt4 book ai didi

kotlin - 检查KClass是否为对象

转载 作者:行者123 更新时间:2023-12-02 13:27:03 24 4
gpt4 key购买 nike

我有以下Kotlin代码:

fun isObject(type: KClass<*>) = type.objectInstance != null

fun main() {
println(isObject(emptyMap<Int, Int>()::class))
}
产生以下错误:
Exception in thread "main" java.lang.IllegalAccessException: class kotlin.reflect.jvm.internal.KClassImpl$Data$objectInstance$2 cannot access a member of class kotlin.collections.EmptyMap with modifiers "public static final"
at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)
at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)
at java.base/java.lang.reflect.Field.checkAccess(Field.java:1075)
at java.base/java.lang.reflect.Field.get(Field.java:416)
at kotlin.reflect.jvm.internal.KClassImpl$Data$objectInstance$2.invoke(KClassImpl.kt:114)
at kotlin.reflect.jvm.internal.ReflectProperties$LazyVal.invoke(ReflectProperties.java:62)
at kotlin.reflect.jvm.internal.ReflectProperties$Val.getValue(ReflectProperties.java:31)
at kotlin.reflect.jvm.internal.KClassImpl$Data.getObjectInstance(KClassImpl.kt)
at kotlin.reflect.jvm.internal.KClassImpl.getObjectInstance(KClassImpl.kt:239)
我希望自己的 isObject函数可用于任何任意的 KClass,但是我不知道如何检查对象实例是否为非null来执行此操作。有什么建议么?

最佳答案

如果您不介意一些反射开销并且它仅适用于Kotlin / JVM,则可以为此使用我的库fluid-meta:

fun isObject(type: KClass<*>) = Meta.of(type) is MObject
如果您仍在使用Kotlin 1.3,请使用0.9.16版,否则该库将无法正常工作。
它使用添加到Kotlin生成的每个类的隐藏的Kotlin元数据注释。如果这些注释有时在项目中被删除(例如,通过积极的ProGuard),那么您将不再在运行时获得该信息。

关于kotlin - 检查KClass是否为对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63255276/

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