如何使用反射实例化 Scala 对象
How to instantiate a Scala object using reflection
我有一些代码使用反射来实例化 Java 或 Scala class,允许用户指定名称:
假设下面的 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 class,这可以正常工作,但如果它是一个对象,则不能。
假设我定义了一个对象:
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
我有一些代码使用反射来实例化 Java 或 Scala class,允许用户指定名称:
假设下面的 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 class,这可以正常工作,但如果它是一个对象,则不能。
假设我定义了一个对象:
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