kotlin - 将 Kotlin 的 KClass 转换为 Java 中的常规 Class

标签 kotlin

我正在尝试在 Java 代码中调用常规 Java 方法,如下所示:

public <T> T proxy(KClass<T> kClass) { 
    // unfortunately nothing like getJavaClass() exists
    return (T) proxy(kClass.getJavaClass()); 
}

public <T> T proxy(Class<T> jClass) {
    return (T) context.getBean(jClass);
}

在 Kotlin 中,您可以在每个 KClass 上调用 .java。这不是这里的情况,我无法从 KClass 中提取 Java Class 对象。有办法吗?

编辑:这在 Kotlin 中是微不足道的,但我正在寻找 Java 代码中的解决方案。

最佳答案

功能确实存在,只是不存在,因为java是一个扩展属性。

使用方法JvmClassMappingKt.getJavaClass

在 Kotlin 中,扩展方法(和属性 getter/setter)被实现为其包含类的 static 方法。如果查看.java的源码(Ctrl+Q),可以看到是在JvmClassMapping.kt中实现的.

由于该函数是包级的并且没有包含对象,因此它只是被放入文件[Filename]Kt 中,在本例中为JvmClassMappingKt

这里是这个扩展属性的来源:

@Suppress("UPPER_BOUND_VIOLATED")
public val <T> KClass<T>.java: Class<T>
    @JvmName("getJavaClass")
    get() = (this as ClassBasedDeclarationContainer).jClass as Class<T>

如您所见,方法的名称在 JVM 上被重命名为 getJavaClass

你的情况,你可以试试:

public <T> T proxy(KClass<T> kClass) { 
    return (T) proxy(JvmClassMappingKt.getJavaClass(kClass)); 
}

关于kotlin - 将 Kotlin 的 KClass 转换为 Java 中的常规 Class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45231961/

相关文章:

android - 使用 Moshi 的 Kotlin codegen 有困难

if-statement - 我想回问用户是否用if/else在我的代码中写了 “Yes” “No”以外的单词

android - 实时数据在更改 fragment 时再次赋予旧值

intellij-idea - TornadoFX Unresolved JavaFx

android - 由 : java. lang.ClassNotFoundException : com. android.tools.lint.client.api.Vendor 引起

Android Kotlin "withTimeout"协程如何处理异常

gradle - `runBlocking` coroutine builder is not resolved in the project(其他builder已解析)

kotlin - 如何使用Gradle Kotlin DSL向所有 jar 添加前缀

android - Kotlin 1.6、Jetpack Compose 1.1.0 编译错误

kotlin - Kotlin 中类型投影的使用站点与声明站点的区别