有一个编译时任务,我需要使用反射运行(调用者和被调用者是 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) 内容就好了。
感谢您提供线索,这.is.frustrating ;-)