Reflexion bekannt Probleme mit dem Symbol init haben und es fehlt auch die Thread-Sicherheit. Vielleicht löst man so das Symptom aus.
angezeigt, dass der ursprüngliche Code funktioniert:
$ scala
Welcome to Scala 2.11.8 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_92).
Type in expressions for evaluation. Or try :help.
scala> object FunninessLevel extends Enumeration {
| type FunninessLevel = Value
| val LOL, ROFL, LMAO = Value
| }
defined object FunninessLevel
scala>
scala> :pa
// Entering paste mode (ctrl-D to finish)
import scala.reflect.runtime.universe._
/**
* Scala [[Enumeration]] helpers implementing Scala versions of
* Java's [[java.lang.Enum.valueOf(Class[Enum], String)]].
* @author Dmitriy Yefremov
*/
object EnumReflector {
private val mirror: Mirror = runtimeMirror(getClass.getClassLoader)
/**
* Returns a value of the specified enumeration with the given name.
* @param name value name
* @tparam T enumeration type
* @return enumeration value, see [[scala.Enumeration.withName(String)]]
*/
def withName[T <: Enumeration#Value: TypeTag](name: String): T = {
typeOf[T] match {
case valueType @ TypeRef(enumType, _, _) =>
val methodSymbol = factoryMethodSymbol(enumType)
val moduleSymbol = enumType.termSymbol.asModule
reflect(moduleSymbol, methodSymbol)(name).asInstanceOf[T]
}
}
/**
* Returns a value of the specified enumeration with the given name.
* @param clazz enumeration class
* @param name value name
* @return enumeration value, see [[scala.Enumeration#withName(String)]]
*/
def withName(clazz: Class[_], name: String): Enumeration#Value = {
val classSymbol = mirror.classSymbol(clazz)
val methodSymbol = factoryMethodSymbol(classSymbol.toType)
val moduleSymbol = classSymbol.companionSymbol.asModule
reflect(moduleSymbol, methodSymbol)(name).asInstanceOf[Enumeration#Value]
}
private def factoryMethodSymbol(enumType: Type): MethodSymbol = {
enumType.member(newTermName("withName")).asMethod
}
private def reflect(module: ModuleSymbol, method: MethodSymbol)(args: Any*): Any = {
val moduleMirror = mirror.reflectModule(module)
val instanceMirror = mirror.reflect(moduleMirror.instance)
instanceMirror.reflectMethod(method)(args:_*)
}
}
// Exiting paste mode, now interpreting.
warning: there were two deprecation warnings; re-run with -deprecation for details
import scala.reflect.runtime.universe._
defined object EnumReflector
scala> val level = EnumReflector.withName(FunninessLevel.getClass, "ROFL")
level: Enumeration#Value = ROFL
die REPL Kräfte Initialisierung durch Zufall manchmal. Die Befehlszeile wird angezeigt:
Der Blog-Code funktioniert für mich nur Einfügen in REPL. Du musst deine Arbeit zeigen. –
@ user1875107: Übergeben Sie 'classOf [MyEnum.Value]' (schlecht) anstelle von 'classOf [MyEnum.type]' oder 'MyEnum.getClass' (gut) zufällig? –