tutorial tipos spark software listas funciones ejemplos datos comentarios scala reflection annotations scala-2.10

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)];