使用Java的反射时,我可以这样做:
method.getParameterTypes()[i]
,它为我提供了参数i
类型(Class
)。
如何使用Kotlin KCallable
实现这一目标?
我尝试过这样的事情:callable.parameters[i].type
但我发现的唯一事情是type.javaType
,但它会返回Type
,这根本无法帮助我。我也试过parameters[i].kind
,但这对我没有任何帮助。
如何使用Kotlin的method.getParameterTypes()
来做Java KCallable
?
答案 0 :(得分:5)
如果您使用的是Kotlin 1.1+,
1)您有kotlin-reflect
,那么您应该使用callable.parameters[i].type.jvmErasure.java
。
2)你没有kotlin-reflect
,然后转到3)
如果您使用的是旧版本,我强烈建议您将代码移植到1.1。如果由于某种原因你必须坚持使用旧的,请转到3),
3)您应首先添加这段代码,该代码计算给定java.lang.reflect.Type
的原型:
import java.lang.reflect.*
val Type.rawtype: Class<*>
get() = when (this) {
is Class<*> -> this
is ParameterizedType -> rawType as Class<*>
is GenericArrayType -> genericComponentType.rawtype.asArrayType()
is TypeVariable<*> ->
this.bounds[0]?.rawtype ?: Any::class.java // <--- A bug of smart cast here, forcing the use of "this."
is WildcardType -> lowerBounds[0].rawtype
else -> throw AssertionError("Unexpected type of Type: " + javaClass)
}
fun Class<*>.asArrayType() = java.lang.reflect.Array.newInstance(this, 0).javaClass
然后只需致电callable.parameters[i].type.javaType.rawtype
。