Доступ к значению аннотации в Scala 3.0

Я создал аннотацию в scala и использовал ее следующим образом:

      object Main extends App {
  println(classOf[Annotated].getAnnotations.length)

  import scala.reflect.runtime.universe._
  val mirror = runtimeMirror(cls.getClassLoader)

}


final class TestAnnotation extends StaticAnnotation

@TestAnnotation
class Annotated

Поскольку это аннотация Scala, ее нельзя прочитать с помощью getAnnotations с другой стороны, scala-reflect зависимость больше не доступна для scala 3.0, поэтому у нас нет доступа к runtimeMirror

Есть ли альтернативное решение для чтения значения аннотации в scala?

1 ответ

Отражение времени выполнения (Java или Scala) не требуется, поскольку информация об аннотациях существует во время компиляции (даже в Scala 2).

В Scala 3 вы можете написать макрос и использовать отражение TASTy

      import scala.quoted.*

inline def getAnnotations[A]: List[String] = ${getAnnotationsImpl[A]}

def getAnnotationsImpl[A: Type](using Quotes): Expr[List[String]] = {
  import quotes.reflect.*
  val annotations = TypeRepr.of[A].typeSymbol.annotations.map(_.tpe.show)
  Expr.ofList(annotations.map(Expr(_)))
}

Использование:

      @main def test = println(getAnnotations[Annotated]) // List(TestAnnotation)

Проверено в 3.0.0-RC2-bin-20210217-83cb8ff-NIGHTLY

Другие вопросы по тегам