在运行时获取Scala 2.10注释值

大卫·摩尔

所以我有一个文档注释,看起来像这样:

case class DocProp(name: String = "", dataType: Class[_] = classOf[Object])

这个想法是默认情况下,我们将内省该字段并查看ID和返回类型,但是在某些情况下需要重写。

我想将其放在模型案例类的字段中,因此我将其声明为typewith @field

type DocProperty = DocProp @field

然后在以下不同情况下使用它:

case class MyModel(
    // 1. use reflection to inspect the property
    @DocProperty
    prop1: Int,

    // 2. override the name
    @DocProperty(name = "myProp")
    prop2: String,

    // 3. override the return type
    @DocProperty(dataType = classOf[String])
    prop3: Option[String],

    // 4. override everything
    @DocProperty("myOtherProp", classOf[Number])
    prop4: Float,

    // 5. don't document this one at all
    hiddenProp: String
)

我终于设法深入了解了值及其相关注释的层次,runtimeMirrorsSymbols仅挖掘了DocProp注释:

// val mc = classOf[MyModel] // passed in
import scala.reflect.runtime.{universe => ru}
val mirror = ru.runtimeMirror(mc.getClassLoader)
val members = mirror.classSymbol(mc).asType.typeSignature.members

val allProps = (for (m <- members) yield {
  val a8ns = m.annotations
  val a8n = a8ns.find(a => a.tpe <:< ru.typeOf[DocProp])
  a8n match {
    case Some(found) => Some((m, found))
    case _ => None
  }
}).flatten

这使我(Symbol, Annotation)仅对带注释的属性进行了迭代(对于反射情况,我仍然需要符号)。

但是,我现在深陷于的迷茫之中reflect.runtime.universe.Trees,对我来说如何走出去还不是很明显。我如何获得

reflect.runtime.universe.Tree = classOf[java.lang.Number]

达到实际Class[Number]价值?我如何获得

reflect.runtime.universe.Tree = doc.this.DocProp.<init>$default$1

到空字符串,甚至到1

尤金·布尔马科(Eugene Burmako)

到目前为止,还没有实现这一目标的简便方法。利用ToolBox.eval是想到的解决方法。我们的JIRA中还有一个类似的问题,它涉及获取Java批注的值:https : //issues.scala-lang.org/browse/SI-6423

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何在运行时的Scala / Java中找到带注释的方法

来自分类Dev

在运行时更改宏的值

来自分类Dev

Symfony2 FosRestBundle在运行时公开属性

来自分类Dev

在运行时向图像添加注释

来自分类Dev

使用Java Reflection在运行时获取字段及其值

来自分类Dev

在运行时修改方法注释参数

来自分类Dev

如何在运行时使用反射从类的对象获取属性的值

来自分类Dev

在运行时注入值

来自分类Dev

在运行时如何转换数据注释?

来自分类Dev

在运行时获取带有注释的guice对象?

来自分类Dev

Angular2导入路径在运行时错误

来自分类Dev

在运行时更改Android Camera 2的Flash设置

来自分类Dev

在运行时创建属性并传递值

来自分类Dev

在运行时动态禁用休眠验证注释?

来自分类Dev

在运行时动态获取Mule流的属性值

来自分类Dev

为什么在运行时无法访问用Scala编写的注释?

来自分类Dev

Angular2无法在运行时呈现SVG

来自分类Dev

如何在运行时使用循环获取属性设置的当前值

来自分类Dev

GDB在运行时输出不同的值

来自分类Dev

如何在运行时读取dockerfile中的值

来自分类Dev

在运行时访问CLI值

来自分类Dev

在运行时向图像添加注释

来自分类Dev

WPF-在运行时更新静态资源值

来自分类Dev

在运行时VB.NET获取多个已创建控件的值

来自分类Dev

数组将在运行时被赋予值和大小

来自分类Dev

在运行时从其他类获取UITextFields(1st Class)和Switches(2nd Class)值

来自分类Dev

如何使用 Dagger 2 在运行时注入字段?

来自分类Dev

在运行时输入值 Oracle

来自分类Dev

在运行时通过反射获取嵌套泛型类型对象的属性和属性值