2013-11-21 2 views
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, когда я invole caseFields метод в другом классеScala среда отражают иногда бросает исключение

Иногда этот метод бросает следующее исключение

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

Ваша трассировка стека не показывает, где в коде генерируется исключение. Я буду предполагать, что вы не проверяете размер 'members'. – pedrofurla

+1

@pedrofurla Даже если размер членов равен нулю. этот метод должен возвращать пустую карту. Я думаю, что это что-то связано с scala-reflect – jilen

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

+0

Итак, если я установил синхронизацию с методом, эта проблема должна быть исправлена? – jilen

+0

Пока вы не выполняете отражение во время работы в другом месте программы. –

+0

Но есть много сторонних библиотек, я не знаю, будут ли они использовать отражение во время выполнения, неудача ... – jilen

Смежные вопросы