我正在尝试理解反射与委派如何协同工作,并且提出了一个玩具示例。
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
。
如何解决此错误?另外,对于这种用例,应该使用一个图书馆吗?
答案 0 :(得分:5)
Class#getMethod
接受两个参数:
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]