Kotlin не удалось получить доступ к делегированному методу через отражение: "java.lang.NoSuchMethodException" - PullRequest
0 голосов
/ 03 мая 2019

Я пытаюсь понять, как рефлексия работает с делегированием, и я придумала игрушечный пример.


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 Ответ

5 голосов
/ 03 мая 2019

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]
...