Scala/java反射--`newInstance`抛出实例化异常
上面的代码工作正常,但当您将其作为scala工作表运行时,它会抛出Scala/java反射--`newInstance`抛出实例化异常,java,scala,reflection,Java,Scala,Reflection,上面的代码工作正常,但当您将其作为scala工作表运行时,它会抛出实例化异常 object classof extends App { trait Config { def test(): Unit } case class Test() extends Config { override def test(): Unit = println("test") } val s = classOf[Test] s.newInstance().test()
实例化异常
object classof extends App {
trait Config {
def test(): Unit
}
case class Test() extends Config {
override def test(): Unit = println("test")
}
val s = classOf[Test]
s.newInstance().test()
}
原因:java.lang.NoSuchMethodException:
反射。A$A20$A$A20$测试。()
位于java.lang.Class.getConstructor0(Class.java:3082)
位于java.lang.Class.newInstance(Class.java:412)
我主要在执行测试时面临这个问题。比如说
Animal.config.newInstance().test
其中Animal是一个实例化的对象,config持有val config:Class[\up>我首先在IntelliJ idea中用scala工作表运行了您的示例,我感觉到了您同样的错误,我的结论是,在scala工作表中反射没有很好地实现,对我来说,日志是:
(我尝试了不同的方法,期望得到不同的结果):
最罕见的是:
trait Config {
def test(): Unit
}
case class Test() extends Config {
override def test(): Unit = println("test")
}
Test.getClass.getSimpleName
val t: Test = classOf[Test].getConstructors()(0).newInstance().asInstanceOf[Test]
t.test()
java.lang.IllegalArgumentException: wrong number of arguments
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(TestingSO.sc)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(TestingSO.sc:58)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(TestingSO.sc:41)
at java.lang.reflect.Constructor.newInstance(TestingSO.sc:419)
...
那是我的scala的名字
然后我制作了一个简单的scala类:
sun.reflect.NativeConstructorAccessorImpl.newInstance0(TestingSO.sc)
而且效果很好
结论
小心使用Scala工作表,有时可能是一个sht haha注意a$A20$a$A20$Test
名称。它暗示这实际上是一个内部类(工作表必须将代码包装到类/对象中,因为Scala不直接支持顶级代码;您将在REPL中看到相同的内容)
内部类需要外部类的一个实例来构造,所以没有没有没有参数的构造函数,只需调用newInstance()
无法工作。只是一个问题。您试图实例化的所有类是否都具有无参数的构造函数?如果没有,可能就是这样。我无法复制您的error@Vlasec不,我只是实例化一个没有参数的简单配置类。有趣的是,它在我的主代码上工作。它在测试和工作表中失败了。
sun.reflect.NativeConstructorAccessorImpl.newInstance0(TestingSO.sc)
class Testing {
}
trait Config {
def test(): Unit
}
case class Test() extends Config {
override def test(): Unit = println("test")
}
object Main{
def main(args: Array[String]): Unit = {
val s = classOf[Test]
s.newInstance().test()
}
}