#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
не должно требоваться конвертировать javaClass<>
в kotlinKClass<>
.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
wherecl: 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