3
註釋值,所以我有一個文檔註釋,如下所示:獲得2.10斯卡拉在運行時
case class DocProp(name: String = "", dataType: Class[_] = classOf[Object])
的想法是,在默認情況下,我們將反省領域,並期待在ID和返回類型,但在某些情況下需要重寫。
我希望把它放在我的樣板案例類的領域,所以我再次聲明它作爲一個type
與@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
?
對於未來的讀者:我最終使用了Java註釋以及Java和Scala反射的混合。它不漂亮,但它的工作。 –