2

我在 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

getAnnotations由于它是一个 Scala 注释,另一方面它无法读取scala-reflect,scala 3.0 不再提供依赖项,因此我们无法访问runtimeMirror

是否有任何替代解决方案来读取 scala 中的注释值?

4

1 回答 1

2

您不需要运行时反射(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 中测试

于 2021-02-17T23:11:15.983 回答