2

リフレクションを使用して実行する必要があるコンパイル時のタスクがあります (呼び出し元と呼び出し先の両方が Scala ソース ファイルです) が、実行時エラーが発生します。

java.lang.ClassCastException: 
scala.collection.immutable.Map$Map2 cannot be cast 
to scala.collection.immutable.Map

反射クラス:

object jsRoutes {
  def getRoutesMap: Map[String,String] = {...}
}

呼び出しコード: (loaderは Scala 2.10.2 クラスローダー)

val appLoader = new java.net.URLClassLoader(path, loader)
val clazz = appLoader.loadClass("controllers.jsRoutes")
val routesMap = clazz.getMethod("getRoutesMap")

java.lang.Object を期待される戻り値の型にキャストしようとするとMap[String,String]、上記の結果になりますClassCastException

routesMap.invoke(new Object).asInstanceOf[Map[String,String]]...

または一致しません:

routesMap.invoke(new Object) match {
  case x: Map[String,String] => ...
  case _ => println("not matched")
}

Map$Map2 について聞いたことがありません。ターゲット クラスでは Map[String,String] であるため、リフレクション呼び出しで何が戻り値の型を変換しているのかわかりません。

キャストされていない java.lang.Object (Map) の内容を問題なく出力できます。

手がかりをありがとう、これはイライラします;-)

4

1 に答える 1