Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 检查KClass是否为对象_Kotlin - Fatal编程技术网

Kotlin 检查KClass是否为对象

Kotlin 检查KClass是否为对象,kotlin,Kotlin,我有以下Kotlin代码: fun isObject(type: KClass<*>) = type.objectInstance != null fun main() { println(isObject(emptyMap<Int, Int>()::class)) } 我希望我的isObject函数能为任意KClass工作,但我不知道如何在不检查对象实例是否为非空的情况下完成它。有什么建议吗?如果您不介意一些反射开销,并且它只适用于Kotlin/JVM,那么

我有以下Kotlin代码:

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)