Неверное количество аргументов, вызывающих конструктор Scala с использованием отражения

Я пытаюсь вызвать метод newInstance конструктора класса Scala (класс case или обычный класс, оба являются

Однако я столкнулся с IllegalArgumentException с подсказкой неправильным количеством аргументов .

Примите во внимание следующее:

case class Vec2(x: Float, y: Float)

object TestApp {
  def main(args: Array[String]) {
    //after some research I found the last constructor always to be the default
    val ctor = classOf[Vec2].getConstructors.last

    println("ctor = " + ctor)
    println("takes parameters: " + ctor.getParameterTypes.length)

    val params = new Array[Float](2)

    params.update(0, 1.0f)
    params.update(1, -1.0f)

    println("num parameters: " + params.length)

    println("trying to create new instance...")
    try {
      val x = ctor.newInstance(params)
      println("new instance: " + x)
    }
    catch {
      case ex => ex.printStackTrace
    }
  }

Результат выглядит следующим образом :

ctor = public pd.test.Vec2(float,float)
takes parameters: 2
num parameters: 2
trying to create new instance...
java.lang.IllegalArgumentException: wrong number of arguments
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at pd.test.TestApp$.main(TestApp.scala:60)
    at pd.test.TestApp.main(TestApp.scala)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:115)

Я однажды испытал нечто подобное на Java. В этом случае класс, который я пытался создать, был внутренним классом другого класса, поэтому Java ожидала неявного дополнительного параметра, который был либо объектом Class включающего класса (если класс был объявлен как статический), либо экземпляром включающего класса.

Однако в этом случае нет включающего класса Vec2 , если только Scala не добавит его внутри (хотя java.lang.Class.getEnclosingClass () возвращает null для меня).

Итак, мой вопрос в том, как создать экземпляры классов Scala с помощью отражения? Существуют ли какие-либо дополнительные параметры, которые конструкторы Scala неявно ожидают?

7
задан pdinklag 2 February 2011 в 07:24
поделиться