Kotlin:如何获取方法参数的类型

时间:2021-01-22 15:51:08

标签: kotlin

我知道我可以通过使用“Method#parameters#name”来获取方法参数的类型。

但是,我的参数都是 A 的子类,我不想想要获得类型 A。我想获取子类名称。

if (checkMethod(i)) {
    val type = i.parameters[0].simpleName
    if (!functions.containsKey(type)) {
        functions[type] = HashMap()
    }
    if (!functions[type]?.containsKey(identifier)!!) {
        functions[type]?.put(identifier, ArrayList())
    }
    functions[type]?.get(identifier)?.add(i)
}

最终解决方案:

    private fun analysis(clazz: KClass<EventHandler>, identifier: String) {
        clazz.members.forEach {
            if(it is KFunction) {
                if(checkMethod(it)) {
                    val type = methodEventType(it)
                    if(!invokeMethods.containsKey(type)) invokeMethods[type] = HashMap()
                    if(!invokeMethods[type]!!.containsKey(identifier)) invokeMethods[type]!![identifier] = ArrayList()
                    invokeMethods[type]!![identifier]!!.add(it.javaMethod)
                }
            }
        }
    }

    private fun checkMethod(method: KFunction<*>): Boolean {
        method.annotations.forEach {
            if(it is EventSubscriber) {
                val type = method.parameters[1].type.classifier
                if(type is KClass<*>) {
                    if(method.parameters.size == 2 && type.superclasses.contains(Event::class)) {
                        return true
                    }
                }
            }
        }
        return false
    } 

注意这里。我不知道为什么方法的第一个参数总是它的类的实例。所以实参是从1开始而不是0。

2 个答案:

答案 0 :(得分:0)

试试这个来获取第一个参数的类:

i.parameters[0]::class.java

答案 1 :(得分:0)

也许你会发现这个例子很有用(适用于 kotlin-reflect:1.4.21

import kotlin.reflect.full.createType
import kotlin.reflect.full.isSubtypeOf
import kotlin.reflect.jvm.reflect

open class A
val aType = A::class.createType()

class B: A()
class C: A()

val foo = { b: B, c: C ->
    println(b)
    println(c)
}

println(foo.reflect()!!.parameters[0].type.classifier == B::class) // true
println(foo.reflect()!!.parameters[1].type.classifier == C::class) // true
println(foo.reflect()!!.parameters[0].type.isSubtypeOf(aType)) // true

获取所有子类

println((foo.reflect()!!.parameters[0].type.classifier as KClass<*>).allSuperclasses.contains(A::class)) // true