我正在尝试在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对象。有办法吗?
答案 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