tipos - ¿Cómo se enumeran todos los campos con una anotación personalizada utilizando el reflejo de Scala en el tiempo de ejecución?
spark scala tutorial (1)
Esto se puede hacer con un TypeTag
, filtrando a través de los members
de su tipo de entrada:
import reflect.runtime.universe._
def listProperties[T: TypeTag]: List[(TermSymbol, Annotation)] = {
// a field is a Term that is a Var or a Val
val fields = typeOf[T].members.collect{ case s: TermSymbol => s }.
filter(s => s.isVal || s.isVar)
// then only keep the ones with a MyProperty annotation
fields.flatMap(f => f.annotations.find(_.tpe =:= typeOf[MyProperty]).
map((f, _))).toList
}
Entonces:
scala> class A { @MyProperty("") val a = 1 ; @MyProperty("a") var b = 2 ;
var c: Long = 1L }
defined class A
scala> listProperties[A]
res15: List[(reflect.runtime.universe.TermSymbol, reflect.runtime.universe.Annotation)]
= List((variable b,MyProperty("a")), (value a,MyProperty("")))
Esto no le proporciona directamente una MyProperty
sino un universe.Annotation
. MyProperty
. Tiene un método scalaArgs
que le da acceso a sus argumentos como árboles si necesita hacer algo con ellos.
Tengo una anotación personalizada como
class MyProperty(val name: String)
extends annotation.StaticAnnotation; // or should I extend something else?
Para una clase dada, ¿cómo puedo enumerar todos sus campos que tienen esta anotación? Estoy buscando algo así como (adivinar):
def listProperties[T: ClassTag]: List[(SomeClassRepresentingFields,MyProperty)];