将Kotlin的KClass转换为Java中的常规类

Voj*_*ěch 7 kotlin

我正在尝试从Kotlin调用常规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);
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin,你可以打电话.java给每个KClass.这不是这种情况,我无法从KClass中提取Java Class对象.有办法吗?

Moi*_*ira 6

功能确实存在,而不是它所在的位置,以及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>
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,您可以尝试:

public <T> T proxy(KClass<T> kClass) { 
    return (T) proxy(JvmClassMappingKt.getJavaClass(kClass)); 
}
Run Code Online (Sandbox Code Playgroud)


小智 5

javaObjectType您可以尝试在您的 KClass 上使用

说明:

返回与给定 [KClass] 实例对应的 Java [Class] 实例。对于原始类型,它返回相应的包装类。

例如

Boolean::class.javaObjectType