Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala/java反射--`newInstance`抛出实例化异常_Java_Scala_Reflection - Fatal编程技术网

Scala/java反射--`newInstance`抛出实例化异常

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()

上面的代码工作正常,但当您将其作为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()

}
原因: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()
  }
}