所以我有一个文档注释,看起来像这样:
case class DocProp(name: String = "", dataType: Class[_] = classOf[Object])
这个想法是默认情况下,我们将内省该字段并查看ID和返回类型,但是在某些情况下需要重写。
我想将其放在模型案例类的字段中,因此我将其声明为type
with @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
)
我终于设法深入了解了值及其相关注释的层次,runtimeMirrors
并Symbols
仅挖掘了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
?
到目前为止,还没有实现这一目标的简便方法。利用ToolBox.eval
是想到的解决方法。我们的JIRA中还有一个类似的问题,它涉及获取Java批注的值:https : //issues.scala-lang.org/browse/SI-6423。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句