java - Kotlin 检查参数的类型

标签 java reflection kotlin

当使用 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/

相关文章:

java - 这些 FindBug 消息显示什么?

java - 我应该扩展 ArrayList (is-a) 还是应该将其作为成员包含 (has-a)?

java - 在JAVA中运行时使用变量中的名称运行一个类

android - 如何在 Kotlin-MVP 的 Adapter 类的 button.setOnClickListener 中显示 fragment 对话框?

android - 如何在 Kotlin 中关闭 Android 应用程序

android - 在 Kotlin 中,我可以将 lint 应用于继承我指定的类的所有类的构造函数吗?

java - 如何更改集群 quartz 作业的时间表?

java - 使用缓冲类型编写器 java 附加文本文件

flash - 点在直线上的反射

java - 从同一类的另一个实例填充对象字段