mercredi 24 juin 2020

Scala reflection to get List field value by universe apply

I defined an annotation class with a List field in Scala:

class TestAnnotation(a: String, b: List[String]) extends StaticAnnotation

And some classes using the annotation, e.g.:

@TestAnnotation("test", List("b1", "b2"))
class TestA

Now I want to get the class annotation values, a and b, by reflection

import scala.reflect.runtime.universe

universe
  .typeOf[TestA]
  .typeSymbol
  .annotations
  .find(_.tree.tpe =:= universe.typeOf[TestAnnotation])
  .map(_.tree).foreach(t => {
    // Match Exceptions happen there! How to match the List fields?
    val universe.Apply(_, universe.Literal(universe.Constant(a: String)) :: universe.Literal(universe.Constant(b: List[String])) :: Nil) = t 
    println(a)
    println(b)
  })

How to get the List value from deconstructing t by matching it against universe.Apply?





Aucun commentaire:

Enregistrer un commentaire