2

リフレクションを使用して 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)

オブジェクトを適切にインスタンス化する方法はありますか?

4

1 に答える 1

4

答えを見つけました:

このリンクを参照してください。次のコードを追加しました。

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
于 2015-05-14T20:27:56.990 に答える