object Reflects {
def mirror() = universe.runtimeMirror(getClass.getClassLoader)
def caseFields(x: AnyRef) = {
val instanceMirror = mirror().reflect(x)
instanceMirror.symbol.typeSignature.members.collect {
case m: MethodSymbol if (m.isCaseAccessor) => m.name.toString -> instanceMirror.reflectMethod(m).apply()
}
}
}
我在其他类中隐藏Reflects
方法时定义了一个对象caseFields
有时此方法会抛出异常
java.lang.UnsupportedOperationException: tail of empty list
at scala.collection.immutable.Nil$.tail(List.scala:339) ~[scala-library.jar:na]
at scala.collection.immutable.Nil$.tail(List.scala:334) ~[scala-library.jar:na]
at scala.reflect.internal.SymbolTable.popPhase(SymbolTable.scala:172) ~[scala-reflect.jar:na]
和其他奇怪的例外。
这种方法有什么问题
答案 0 :(得分:3)
在2.10.3中(可能在2.10.4中,因为看起来我们没时间从2.11.0-M7向后端移植修复程序),运行时反射不是线程安全的: http://docs.scala-lang.org/overviews/reflection/thread-safety.html。堆栈跟踪是问题的众多可能表现形式之一。
坏消息是,在2.10.x中,除了将所有反射操作放在同步块中之外,没有针对线程不安全问题的解决方法。好消息是在2.11.0中问题应该消失了。