Как работать с varargs (количество аргументов) и отражением в Kotlin - PullRequest
0 голосов
/ 22 января 2020

У меня есть этот метод (в java):

public void insert(final MyCustomObject... obj)

Я знаю имя пакета и имя класса MyCustomObject, а также имя метода, поэтому я использую его во время отражение (используя Kotlin):

val myCustomObjectClass = Class.forName("${packageName}${className}")
val myCustomObject = myCustomObjectClass.getConstructor(String::class.java, Long::class.java)
val insertMethod = classContainingInsertMethod.getDeclaredMethod("insert", myCustomObjectClass)

класс classContainingInsertMethod был создан ранее. Теперь, как я могу вызвать метод? Я получил исключение, что такого метода нет. Я знаю об этом, потому что это несколько аргументов, а не один.

Я пытался использовать arrayOf(myCustomObjectClass)::class.java, но это дало мне еще одно исключение. Использование *myCustomObjectClass тоже не сработало.

1 Ответ

2 голосов
/ 22 января 2020
import java.lang.reflect.Array
val varArg = Array.newInstance(myCustomObjectClass, 1)
val varArgClass = varArg::class.java
val myCustomObjectConstructor = myCustomObjectClass.getConstructor(String::class.java, Long::class.java)
val myCustomObjectElement = myCustomObjectConstructor.newInstance("", 0L)
Array.set(varArg, myCustomObjectElement, 0)

(здесь размер массива и количество вызовов set будут соответствовать числовым аргументам, которые вы хотите передать в varargs), а затем

val insertMethod = classContainingInsertMethod.getDeclaredMethod("insert", varArgClass)
insertMethod.invoke(instanceOfClassContainingInsertMethod, varArg)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...