Передать массив произвольных аргументов методу, вызванному с помощью отражения - PullRequest
0 голосов
/ 23 марта 2012

Мне нужно создать функцию, которая создает класс из произвольной строки и передает массив параметров фиксированному методу, называемому «render». Проблема в том, что в зависимости от класса метод render может принимать различное количество аргументов. К сожалению, метод "render" нельзя изменить, чтобы он принимал varargs, поэтому мне интересно, смогу ли я передать аргументы как массив?

Это приводит к: "java.lang.IllegalArgumentException: неправильное количество аргументов"

Вот код:

def perform(strClazz: String, pTypes: Array[Class[_]], params: Array[Object]) = {
  val clazz = MyClassLoader.loadClass(strClazz)
  val render = clazz.getDeclaredMethod("render", pTypes: _*)
  // params: java.lang.IllegalArgumentException: wrong number of arguments
  render.invoke(clazz, params)
}

И я звоню через:

perform("MyClass",Array[Class[_]](classOf[String], classOf[String]),Array[Any]("first", "second"))

Вызванный метод принимает в качестве аргументов две строки, поэтому работает следующее:

render.invoke(clazz, "first", "second")

Разве нельзя передать массив?

1 Ответ

2 голосов
/ 23 марта 2012
scala> class Foo { def f(s: String, i: Int): Unit = () }
defined class Foo

scala> classOf[Foo].getDeclaredMethod("f", Array(classOf[String], classOf[Int]):_*)
res0: java.lang.reflect.Method = public void Foo.f(java.lang.String,int)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...