首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类vs类型注解(不具有形状)

类vs类型注解(不具有形状)
EN

Stack Overflow用户
提问于 2019-04-16 22:54:11
回答 1查看 174关注 0票数 0

根据scala 文档,有四种注释:

  1. 类注释:@ClassAnnotation case class Foo(...)
  2. 变量/值注释:@ValAnnotation val field: String
  3. 类型注释:field: String @TypeAnnotation
  4. 表达式注释

通过使用shapeless.Annotationshapeless.Annotations,很容易从case类获得类和变量注释(1&2)。如何获得其字段的类型注释(3)?

示例:

代码语言:javascript
复制
@ClassAnnotation
case class Foo(
  @ValAnnotation field: String @TypeAnnotation
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-17 07:36:42

你可以写一个宏

代码语言:javascript
复制
import scala.language.experimental.macros
import scala.reflect.macros.blackbox

def getAnnotation[A]: Any = macro impl[A]

def impl[A: c.WeakTypeTag](c: blackbox.Context): c.Tree = {
  import c.universe._

  println(weakTypeOf[A].typeSymbol.annotations) // List(ClassAnnotation)

  println(weakTypeOf[A]
    .member(termNames.CONSTRUCTOR)
    .asMethod
    .paramLists
    .map(_.map(_.annotations))
  ) // List(List(List(ValAnnotation)))

  println(weakTypeOf[A]
    .member(termNames.CONSTRUCTOR)
    .asMethod
    .paramLists
    .map(_.map(_.typeSignature match {
      case AnnotatedType(annots, _) => annots
      case _ => List()
    })) // List(List(List(TypeAnnotation)))
  )

  q""
}

import scala.annotation.StaticAnnotation

case class ClassAnnotation() extends StaticAnnotation
case class ValAnnotation() extends StaticAnnotation
case class TypeAnnotation() extends StaticAnnotation

@ClassAnnotation
case class Foo(
                @ValAnnotation field: String @TypeAnnotation
              )

getAnnotation[Foo]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55717650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档