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

时间:2017-07-21 07:46:34

标签: 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代码的解决方案。

2 个答案:

答案 0 :(得分: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>

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

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

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

答案 1 :(得分:0)

您可以尝试在KClass上使用javaObjectType

说明:

  

返回与给定[KClass]实例相对应的Java [Class]实例。   如果是基本类型,则返回相应的包装器类。

例如

Boolean::class.javaObjectType