在 Scala 3.0 中获取注解值
Access to annotation value in 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 中的注释值?
您不需要运行时反射(Java 或 Scala),因为有关注释的信息在编译时就存在(即使在 Scala 2 中)。
在 Scala 3 中你可以写一个 macro and use 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 中测试
我在 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 中的注释值?
您不需要运行时反射(Java 或 Scala),因为有关注释的信息在编译时就存在(即使在 Scala 2 中)。
在 Scala 3 中你可以写一个 macro and use 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 中测试