Я пытаюсь вызвать метод 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 неявно ожидают?