Преобразовать класс java в KClass kotlin

#java #kotlin

#java #kotlin

Вопрос:

как будто у меня есть функция kotlin:

 object KotlinFunc {
    @JvmStatic
    fun create(mycls: KClass<*>) {...}
}
  

Я хочу вызвать эту функцию в коде Java, но это не работает:

 public void javaFunc() {
   KotlinFunc.create(MyClass.class)
}
  

Ответ №1:

Это возможно с помощью вызова getKotlinClass функции в Java:

 kotlin.jvm.JvmClassMappingKt.getKotlinClass(MyClass.class);
  

вы можете вызвать свою функцию следующим образом:

 kotlin.reflect.KClass<MyClass> kClass = kotlin.jvm.JvmClassMappingKt.getKotlinClass(MyClass.class);
KotlinFunc.create(kClass);
  

и убедитесь, что kotlin-reflect находится в вашем пути к классу, например:

с помощью Gradle Kotlin:

 dependencies {
    ...
    implementation(kotlin("reflect"))
    ...
}
  

с помощью Gradle Groovy:

 dependencies {
    ...
    implementation 'org.jetbrains.kotlin:kotlin-reflect'
    ...
}
  

Комментарии:

1. kotlin-reflect не должно требоваться конвертировать java Class<> в kotlin KClass<> . JvmClassMappingKt объявлено в kotlin-stdlib .

2. @Ilya Я не могу найти JvmClassMappingKt в kotlin-stdlib , я уверен, что вам все еще нужно kotlin-reflect

3. @MohamedAouledIssa Полное имя этого класса — kotlin.jvm.JvmClassMappingKt и оно находится в kotlin-stdlib артефакте. Обратите внимание, что именно так этот класс выглядит в коде Java, а не в коде Kotlin.

4. Код компилируется без kotlin-reflect, но когда он не включен, возникает исключение во время выполнения, поэтому он все-таки необходим.

Ответ №2:

В Kotlin Class есть свойство расширения .kotlin .

Он объявлен в kotlin.jvm.JvmClassMapping.kt (исходном коде).

В Java это будет выглядеть как статический метод <T> KClass<T> getKotlinClass(Class<T>) в классе kotlin.jvm.JvmClassMappingKt .

Комментарии:

1. Я не уверен, что это сопоставит классы java с классами kotlin. хитрость заключается в использовании kotlin-reflection JavaToKotlinClassMap

2. Если вы говорите о том, чтобы не преобразовывать, например, java.lang.String в kotlin.String , вопрос об этом не задается.

3. «В классе Kotlin есть свойство расширения .kotlin». — действительно? Я пытаюсь использовать cl.kotlin where cl: Class<*> , но безуспешно.

4. Здесь: kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm /… . Проблема может заключаться в том, что он ограничен Class<T: Any> , поэтому * не будет работать.

5. Exception::class.java.kotlin для меня это сработало. 🙂 @Alexey Romanov спасибо!

Ответ №3:

Вы можете сделать это таким образом, используя стандартную библиотеку:

 KClass kotlinClass = Reflection.createKotlinClass(MyClass.class);
KotlinFunc.create(kotlinClass)
  

Комментарии:

1. Это возможно сделать в Kotlin, поэтому его можно вызвать из Java.

2. Вы правы. Я обновил ответ, чтобы использовать соответствующий метод из kotlin-stdlib

Ответ №4:

Используйте KClass<Object> k = new ClassReference(myJavaClass) . Из этого коммита в 2015 году: https://github.com/JetBrains/kotlin/commit/628bb774fd404a307499575fd30c7325e6660d18