2013-12-20 58 views
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

回答

1

到目前爲止,沒有簡單的方法來實現這一點。使用ToolBox.eval是想到的解決方法。我們的JIRA中也有類似的問題,涉及獲取Java註釋的值:https://issues.scala-lang.org/browse/SI-6423

+1

對於未來的讀者:我最終使用了Java註釋以及Java和Scala反射的混合。它不漂亮,但它的工作。 –