0

我正在尝试使用 Class.forName 从我的对象调用一个方法,但我有 java.lang.ExceptionInInitializerError

class MainClass(implicit val executionContex: ExecutionContext, usersDAO: UsersDAO){

  def findUser(user: User): Future[Option[User]] = {
    usersDAO.find(user)
  }

}

// 我想调用我的函数

  val myClass = Class.forName("MainClass").newInstance().asInstanceOf[MainClass]

 //  myClass.findUser(User(0,"a", "a", "a"))

[信息] 完成包装。

[信息] 运行 com.base.app.WebServer

[错误] (run-main-0) java.lang.ExceptionInInitializerError

[错误] java.lang.ExceptionInInitializerError

[错误] 在 com.base.app.WebServer.main(WebServer.scala)

[错误] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

4

1 回答 1

0

当我尝试以这种方式创建时,我应该分配参数,但如果使用 class.forName 我不应该使用分配参数

Class.forName("MainClass").newInstance()相当于new MainClass()没有参数,如果该构造函数不存在,则调用将失败。对于你展示的类,这个构造函数不存在。Java 反射也不知道隐式参数,所以你必须明确地提供它们(Scala 反射也好不了多少)。

所以是的,您确实需要传递参数来创建实例,只是以一种不同且类型安全性较低的方式:

Class.forName("MainClass").getConstructors()(0).newInstance(param1, param2).asInstanceOf[MainClass]

另请注意,参数 offorName是完全限定的类名,即它不应该只是"MainClass"but "your.package.MainClass"

于 2019-07-24T07:26:34.263 回答