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

问题描述 投票:5回答:2

我正在尝试在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代码的解决方案。

kotlin
2个回答
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)); 
}

0
投票

您可以尝试在KClass上使用javaObjectType

说明:

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

EG

Boolean::class.javaObjectType

© www.soinside.com 2019 - 2024. All rights reserved.