Kotlin检查参数的类型
当使用Java的反射,我可以做这样的事情: method.getParameterTypes()[i]
给我参数的i
类型( Class
)。
如何使用Kotlin的KCallable
来实现这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
的rawtype:
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
。