【问题标题】:How to extract information from ClassFileAnnotArg in Scala 2.10如何从 Scala 2.10 中的 ClassFileAnnotArg 中提取信息
【发布时间】:2012-09-25 07:40:14
【问题描述】:

我正在尝试使用 Scala 2.10M7 中的新反射 API 来提取构造函数参数的注释。注释是用 Java 编写的,因为我在运行时需要它们,当我尝试在 Scala 中执行它们时,我收到了一条警告,建议我使用 Java。

我已经成功地为每个构造函数参数和注释获得了一个符号......但我最终得到了 ClassFileAnnotArg 类型的东西(下面的代码中的 av)。我不确定如何处理这些。查看源代码/scaladocs 似乎我想拆分一些案例类,但我不知道该怎么做。

我不认为这个问题是特定于构造函数 args 上的注释,但我想为它们使用更详细的 scala 反射,不能只使用 Java 注释反射机制。

import scala.reflect.runtime._
val ty = universe.typeOf[Test1]
val constructors = ty.member(universe.nme.CONSTRUCTOR)
for (constructor<-constructors.asTerm.alternatives.map{_.asMethod}) {
  println("Constructor = "+constructor)
  println("Overloaded = "+constructor.isOverloaded)
  for (pp<-constructor.params) {
    println("Constructor params")
    for (p<-pp) {
      println("  name="+p.name)
      println("  type="+p.typeSignature)
      for (a<-p.getAnnotations) {
        println("  annotation "+a.atp)
        for ((aname,av)<-a.assocs) {
          println("     "+aname.decoded+"="+av)
        }
      }
    }
  }
}

有没有办法获取注解对象的实例(就像你在 Java 注解中所做的那样),或者你是否必须通过 getAnnotations / 检查它是你想要的 / 遍历 assocs / 检查它是您想要/以某种方式将结果与预期类型匹配/获得结果?

【问题讨论】:

    标签: scala reflection scala-2.10


    【解决方案1】:

    目前您无法获得注解对象的实例,尽管这是个好主意。我会尽量在 RC1 之前把它挤进去。更新。糟糕,我们目前处于锁定状态。这得等到2.10.1:https://issues.scala-lang.org/browse/SI-6423

    传统的方法是在av 上对LiteralAnnotArgArrayAnnotArgNestedAnnotArg 进行模式匹配(顺便说一句,这些名称将在RC1 中更改为仅LiteralArgumentArrayArgument 和`NestedArgument)。

    【讨论】:

    • 谢谢。我可以匹配av match { case l:universe.LiteralAnnotArg =&gt; 之类的代码,但我收到关于类型擦除的编译器警告:abstract type reflect.runtime.universe.LiteralAnnotArg in type pattern reflect.runtime.universe.LiteralAnnotArg 未选中,因为它已被擦除
    • 如果您import universe._ 并尝试重新编译怎么办?警告还会存在吗?
    • 这确实使警告消失了。 (我不明白为什么)
    • 这是因为通配符导入在范围内引入了一个类标签。当你有一个抽象类型的类标签时,模式匹配器可以使用它来克服擦除。
    • 但是,你所面临的问题一开始就不应该发生。我会看看我能做些什么来让用户体验更好。
    猜你喜欢
    • 2019-08-31
    • 2011-09-25
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2016-02-25
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多