微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

访问 Scala 3.0 中的注释值

如何解决访问 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 3.0 不再提供 scala-reflect 依赖项,因此我们无法访问 runtimeMirror

是否有其他解决方案可以读取 Scala 中的注释值?

解决方法

您不需要运行时反射(Java 或 Scala),因为有关注释的信息存在于编译时(即使在 Scala 2 中)。

在 Scala 3 中,您可以编写 macro 并使用 TASTy reflection

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 中测试

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。