Kotlin 检查KClass是否为对象
我有以下Kotlin代码:Kotlin 检查KClass是否为对象,kotlin,Kotlin,我有以下Kotlin代码: fun isObject(type: KClass<*>) = type.objectInstance != null fun main() { println(isObject(emptyMap<Int, Int>()::class)) } 我希望我的isObject函数能为任意KClass工作,但我不知道如何在不检查对象实例是否为非空的情况下完成它。有什么建议吗?如果您不介意一些反射开销,并且它只适用于Kotlin/JVM,那么
fun isObject(type: KClass<*>) = type.objectInstance != null
fun main() {
println(isObject(emptyMap<Int, Int>()::class))
}
我希望我的
isObject
函数能为任意KClass
工作,但我不知道如何在不检查对象实例是否为非空的情况下完成它。有什么建议吗?如果您不介意一些反射开销,并且它只适用于Kotlin/JVM,那么您可以使用我的库:
fun-isObject(类型:KClass)=Meta.of(类型)是MObject
如果仍然使用Kotlin 1.3,则使用版本0.9.16,否则库将无法工作
它使用添加到由Kotlin生成的每个类中的隐藏Kotlin元数据注释。如果这些注释在您的项目中某个时候被剥离(例如被一个激进的程序员剥离),那么您在运行时将不再拥有这些信息。有趣的是,我只看到在
private object
s中发生这种情况,而EmptyMap
就是这种情况。我会进一步调查的。无论如何,在本例中,您可以尝试查看底层java类是否有类类型的实例
字段,并且不是null
。是的,我只是先检查该类是否是Kotlin类,但我将把这个问题保留一段时间,看看是否有更好的方法。编辑-当我使用java.awt.Rectangle
进行编辑时,有时也会发生这种情况,但这个问题似乎已经停止了Hanks,这很酷,但我真的只想要一行。无论如何,我很感激。
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)