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

nz_*_*_21 0 reflection delegation kotlin

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


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()))
}
Run Code Online (Sandbox Code Playgroud)

这给我一个错误:

Exception in thread "main" java.lang.NoSuchMethodException: Foo.add()
Run Code Online (Sandbox Code Playgroud)

我不知道我理解为什么它的发生,看到 add()被委派给Foo从MutableList如果我理解正确。

如何解决此错误?另外,是否有一个应该用于这种用例的库?

cac*_*co3 5

Class#getMethod 接受两个参数:

  1. 方法的名称。
  2. 参数类型(Class<?>es的vararg )。

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

您打算获得这样的方法:

clazz.java.getMethod("add", Any::class.java)
Run Code Online (Sandbox Code Playgroud)

完整清单:

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)
}
Run Code Online (Sandbox Code Playgroud)

输出:

[10]
Run Code Online (Sandbox Code Playgroud)