2
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]

和其他奇怪的例外。

这种方法有什么问题

4

1 回答 1

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 中问题应该消失了。

于 2013-11-24T15:34:56.887 回答