2016-11-04 1 views
0

все:Как получить аннотацию со значением по умолчанию в scala

Как получить объект аннотации со значением по умолчанию для комментариев?

import scala.annotation.StaticAnnotation 
import scala.reflect.runtime._ 
import scala.reflect.runtime.universe._ 

// The annotation has default value 
case class Table(idField: String = "") extends StaticAnnotation 

@Table() 
case class SomeEntity() 


println(getClassAnnotation[Table](classOf[SomeEntity]).idField) 

def getClassAnnotation[A: TypeTag](beanClazz: Class[_]): A = { 
    val typeAnnotation=currentMirror.typeOf[A] 
    currentMirror.classSymbol(beanClazz).toType.typeSymbol.asClass.annotations.find(a => a.tree.tpe == typeAnnotation).map { 
    annotation => 
     val value = annotation.tree.children.tail.map(_.productElement(0).asInstanceOf[Constant].value) 
     currentMirror.reflectClass(typeAnnotation.typeSymbol.asClass). 
     reflectConstructor(typeAnnotation.decl(termNames.CONSTRUCTOR).asMethod)(value: _*) 
    }.get.asInstanceOf[A] 
} 

Ошибка

java.lang.ClassCastException: scala.reflect.internal.Trees$Select cannot be cast to scala.reflect.api.Constants$ConstantApi 

Если корректирующее значение будет проходить, как этот

@Table(idField="code") 
case class SomeEntity() 

ответ

1

можно использовать scala.tools.reflect.ToolBox для достижения этой цели:

import scala.tools.reflect.ToolBox 
val tb = currentMirror.mkToolBox() 
val result = tb.eval(tb.untypecheck(annotation.tree)).asInstanceOf[Table] 

Это будет продавать uce результат как класс case Table со всеми полями, включая значения по умолчанию.