scala - 如何使用反射实例化 Scala 对象

标签 scala reflection scala-2.10 scala-2.11 scala-reflect

我有一些代码使用反射来实例化 Java 或 Scala 类,允许用户指定名称: 假设下面的 loadIt 是使用 this approach 定义的假设方法。 .

def getInstance(name:String, jar:String) = {
   val c:Class[_] = loadIt(name, jar) // load class from the jar
   c.newInstance.asInstanceOf[AnyRef] // return new instance of the class
}

如果 name 是一个 Scala 类,那么这可以正常工作,但如果它是一个对象,则不行。 假设我定义了一个对象:

object Foo

并将其命名为:

getInstance("Foo", "someJar.jar")

我收到错误:

java.lang.InstantiationException: Foo
    at java.lang.Class.newInstance(Class.java:364)

有什么方法可以正确实例化该对象吗?

最佳答案

找到答案:

引用this link 。添加以下代码:

import scala.reflect.runtime.universe._
def getObjectInstance(clsName: String):AnyRef = {
  val mirror = runtimeMirror(getClass.getClassLoader)
  val module = mirror.staticModule(clsName)
  mirror.reflectModule(module).instance.asInstanceOf[AnyRef]
}
val c:Class[_] = loadIt("Foo", "someJar.jar") // ok 
val o = try c.newInstance.asInstanceOf[AnyRef] catch {
    case i:java.lang.InstantiationException => getObjectInstance("Foo")
}
// works

关于scala - 如何使用反射实例化 Scala 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30245634/

相关文章:

scala - `super` 是否静态绑定(bind)在类中?

c# - 如何获取 MemberInfo 的值?

java - 更改 Java 中被调用方法内使用的对象的属性

c# - 通过 System.Reflection 访问内部成员?

Scala 案例类复制方法在 2.9 和 2.10 之间的差异

scala - 如何解决 Scala 2.10.x 扁平化问题

Scala 错误 : class file is broken, 错误的常量池索引

scala - NoClassDefFoundError 使用 scoverage 插件在 SBT 中运行测试

scala 的 spire 框架 : I am unable to operate on a group

scala - Sbt-assembly Unresolved 依赖项,Scala