Проверка, является ли KClass объектом - PullRequest
1 голос
/ 05 августа 2020

У меня есть следующий код 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 но я не знаю, как это сделать, не проверив, является ли экземпляр объекта ненулевым. Есть предложения?

1 Ответ

1 голос
/ 08 августа 2020

Если вы не возражаете против накладных расходов на отражение и что он работает только с Kotlin / JVM, тогда вы можете использовать мою библиотеку fluid-meta для этого:

fun isObject(type: KClass<*>) = Meta.of(type) is MObject

Использовать версию 0.9.16, если вы все еще используете Kotlin 1.3 и в противном случае библиотека не будет работать.

Он использует скрытые аннотации метаданных Kotlin, добавленные к каждому классу, сгенерированному Kotlin. Если эти аннотации будут удалены в вашем проекте в какой-то момент (например, агрессивным ProGuard), тогда у вас больше не будет этой информации во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...