2015-05-14 80 views
2

我有一些代碼使用反射來實例化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) 

有什麼辦法,我可以適當地實例化對象?

回答

3

找到了答案:

參考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