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



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

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)

是否有任何方法可以正确实例化对象?

找到答案了:

参考这个链接。增加了以下代码:

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

相关内容

  • 没有找到相关文章

最新更新