Kotlin无法通过反射访问委托的方法:“ java.lang.NoSuchMethodException”

时间:2019-05-03 08:50:57

标签: kotlin reflection delegation

我正在尝试理解反射与委派如何协同工作,并且提出了一个玩具示例。


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()Foo委托给MutableList

如何解决此错误?另外,对于这种用例,应该使用一个图书馆吗?

1 个答案:

答案 0 :(得分:5)

Class#getMethod接受两个参数:

  1. 方法名称。
  2. 参数类型(Class<?> 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]