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]

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

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


person jilen    schedule 21.11.2013    source источник
comment
Ваша трассировка стека не показывает, где в вашем коде возникает исключение. Я предполагаю, что вы не проверяете members размер.   -  person pedrofurla    schedule 21.11.2013
comment
@pedrofurla Даже если размер участников равен нулю. этот метод должен возвращать пустую карту. Я думаю, что это что-то связанное со scala-reflect   -  person jilen    schedule 22.11.2013
comment
Не могли бы вы опубликовать полную трассировку стека? Кроме того, вы запускаете этот метод в нескольких потоках?   -  person Eugene Burmako    schedule 22.11.2013
comment
@jilen Совершенно верно, глупый я.   -  person pedrofurla    schedule 22.11.2013
comment
@EugeneBurmako Я вызываю этот метод у одного или нескольких актеров akka.   -  person jilen    schedule 24.11.2013
comment
@jilen Смотрите мой ответ ниже.   -  person Eugene Burmako    schedule 24.11.2013


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

person Eugene Burmako    schedule 24.11.2013
comment
Итак, если я поставлю синхронизированный метод, эта проблема должна быть исправлена? - person jilen; 25.11.2013
comment
Пока вы не выполняете отражение во время выполнения где-либо еще в программе. - person Eugene Burmako; 25.11.2013
comment
Но есть много сторонних библиотек, я не знаю, будут ли они использовать отражение во время выполнения, незадача... - person jilen; 25.11.2013
comment
Я попробую перейти на бэкпорт либо в 2.10.4, либо в 2.10.5. - person Eugene Burmako; 25.11.2013