我正在尝试在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));
}
您可以尝试在KClass上使用javaObjectType
说明:
返回与给定[KClass]实例对应的Java [Class]实例。在原始类型的情况下,它返回相应的包装类。
EG
Boolean::class.javaObjectType