Проверьте мой EnumReflector , который расскажет вам все о типах полей перечисления, если они объявлены в области действия пакета (без перечислений внутреннего класса, перечислений области действия).
Вам необходимо указать тип поля enum типа scala (который можно найти через интерфейс отражения scala) (см. Ниже, как получить его из класса [_])
val enumObjectType:Type = ... object's scala.Enumeration.Value field
val isEnum = EnumReflector.isEnumeration(enumObjectType)
val reflector = EnumReflector(typ)
val eid = reflector.toID(enumObject)
val enum = reflector.fromID(eid)
assertTrue(eid eq enum)
Какполучить enumObjectType?
val typ = typeOf[EC]
// OR
val typ = getTypeForClass(classOf[EC]) // or from your package scanner
val enumGetters = classAccessors( typ ).filter(EnumReflector.isEnumeration(_))
// Let's looks at the 1st enum field
val reflector = EnumReflector(enumGetters.head.returnType)
val fieldName = enumGetters.head.name.toString
... теперь вам нужно использовать отражение Java, чтобы найти тот же метод для этого класса.Scala имеет отражение экземпляра, но требует, чтобы вы отражали экземпляр во время выполнения (что медленно).Лучше получить дескриптор вызова метода отражения Java:
val enumGetter = toJavaClass(typ).getMethods.filter(_.getName==fieldName).head
Начиная с вашего
val obj = new MyThing()
, теперь вы можете получить поле enum объекта и интерпретировать его имя или идентификатор через отражатель:
val enumObj = enumGetter.invoke(obj)
val name = reflector.toName(enumObj)
val enumObj2 reflector.fromName(name)
assertTrue( enumObj2 eq enumObj )
Функции поддержки:
import scala.reflect.runtime.universe._
val mirror = runtimeMirror(this.getClass.getClassLoader)
def toJavaClass(tpe:Type) = mirror.runtimeClass(tpe.typeSymbol.asClass)
def getTypeForClass(clazz: Class[_]): Type = mirror.classSymbol(clazz).toType
def classGetters(typ:Type) = typ.members.collect{case m:MethodSymbol=> m}.filter(_.isGetter)
def classAccessors(typ:Type) = typ.members.collect{case m:MethodSymbol=> m}.filter(_.isAccessor)
В проекте есть модульный тест, демонстрирующий это.