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

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

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对象 的全部内容, 来源链接: utcz.com/qa/266596.html

回到顶部