【问题标题】:Kotlin unable to access delegated method via reflection: "java.lang.NoSuchMethodException"Kotlin 无法通过反射访问委托方法:“java.lang.NoSuchMethodException”
【发布时间】:2019-09-21 19:04:36
【问题描述】:

我试图了解反射如何与委托一起工作,并且我想出了一个玩具示例。


class Foo(val m: MutableList<Any>) : MutableList<Any> by m{
}



fun fooAdd(f: Foo) {
    val a = f::class.java.getMethod("add").invoke(f, 20);
    println(a)
}

fun main(args: Array<String>) {
    fooAdd(Foo(mutableListOf()))
}

这给了我一个错误:

Exception in thread "main" java.lang.NoSuchMethodException: Foo.add()

我不确定我理解为什么会这样,如果我理解正确的话,add() 会从 MutableList 委托给 Foo

如何解决此错误?另外,是否有一个图书馆应该用于这样的用例?

【问题讨论】:

    标签: kotlin reflection delegation


    【解决方案1】:

    Class#getMethod 接受两个参数:

    1. 方法的名称。
    2. 参数类型(Class&lt;?&gt;es 的可变参数)。

    MutableList 没有没有参数的add 方法,所以你得到java.lang.NoSuchMethodException

    你的意思是得到这样的方法:

    clazz.java.getMethod("add", Any::class.java)
    

    完整列表:

    fun main() {
        val list = mutableListOf<Int>()
        val clazz = MutableList::class
        val method = clazz.java.getMethod("add", Any::class.java)
        method.invoke(list, 10)
        println(list)
    }
    

    输出:

    [10]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-08
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多