Scala Runtime отражает иногда выдает исключение

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]

И другое странное исключение.

Что не так с этим методом

1 ответ

Решение

В 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 проблема должна исчезнуть.

Другие вопросы по тегам