2013-07-22 14 views
6

Mam niestandardowego adnotacji jakJak wyświetlić listę wszystkich pól z adnotacją niestandardową za pomocą refleksji Scala w czasie wykonywania?

class MyProperty(val name: String) 
    extends annotation.StaticAnnotation; // or should I extend something else? 

dla danej klasy, jak mogę wymienić wszystkich pól, które mają tę notatkę? Czekam na coś takiego (tylko zgadywać):

def listProperties[T: ClassTag]: List[(SomeClassRepresentingFields,MyProperty)]; 

Odpowiedz

11

Można to zrobić z TypeTag, filtrując przez members swojej Typ wejścia:

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 
} 

wówczas:

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(""))) 

To nie daje bezpośrednio MyProperty, ale universe.Annotation. Ma on metodę scalaArgs, która daje dostęp do jej argumentów jako drzew, jeśli musisz coś z tym zrobić.

Powiązane problemy