首页 > 解决方案 > 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 开始。

标签: kotlin

解决方案


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

i.parameters[0]::class.java

推荐阅读