当使用 Java 的反射时,我可以这样做:
method.getParameterTypes()[i]
为我提供参数的 i
类型 (Class
)。
如何使用 Kotlin 的 KCallable
实现此目的?
我尝试过这样做: callable.parameters[i].type
但我发现的唯一的东西是 type.javaType
但它返回 Type
这根本没有帮助我。我还尝试了 parameters[i].kind
但这根本没有帮助我。
如何使用 Kotlin 的 KCallable
执行 Java 的 method.getParameterTypes()
操作?
最佳答案
如果您使用的是 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
。
关于java - Kotlin 检查参数的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43698237/