【问题标题】:Create instance of a Class type using newInstance()使用 newInstance() 创建 Class 类型的实例
【发布时间】:2016-02-17 09:15:17
【问题描述】:

所以我正在尝试使用以下语句(简化)创建一个类的实例:

class A
classOf[A].newInstance()

调用抛出:

java.lang.InstantiationException: A$A426$A$A426$A
Caused by: java.lang.NoSuchMethodException: A$A426$A$A426$A.<init>()

我确实尝试用不同的变体定义 init() 方法,但没有成功。我错过了什么?

提前致谢。


相关,对我不起作用:

No such method exception Hadoop <init>

This answer

【问题讨论】:

  • A 类有没有参数的构造函数?
  • @pasabaporaqui 我不能说内部实现,但声明 new A 是有效的
  • 你在哪里声明 A?
  • 在 Scala REPL (v2.11.7) 中准确输入这两行代码。向我们展示您有此问题的真实代码,而不是这个简化的示例。该错误意味着该类没有无参数构造函数。 init() 方法不是构造函数,因此添加 init() 方法将无济于事。

标签: scala reflection


【解决方案1】:

我怀疑您的问题是 A 在另一个类中被声明。看这个例子:

import org.specs2.mutable.Specification

class StackoverflowSpec extends Specification {

  class B

  "A" should {
    "be instantiatable" in {
      classOf[A].newInstance() must not(beNull)
    }
  }

  "B" should {
    "throw an instantiation exception" in {
      classOf[B].newInstance must throwAn[InstantiationException]
    }
  }
}

class A

我认为正在发生的事情是,在 jvm 中,您的类是 AStackoverflowSpec$B,而 StackoverflowSpec$B 需要将 StackoverflowSpec 传递给它的构造函数,因为它是一个内部类。

【讨论】:

    【解决方案2】:

    感谢有关内部类的建议,但实际上它与 IntelliJ IDEA 'scala worksheet' - 具有交互式评估的 scala 沙箱文件有关。出于某种原因,上面描述的实例化只在工作表中抛出,它确实在常规的 Scala REPL 中工作。

    【讨论】:

    • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • 我是作者。 “为什么它不起作用”的实际答案是未知的,因为它是 IDE 缺陷/功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多