我想在Scala 2.10M7中使用新的反射API來提取構造函數參數的註釋。註釋是用Java編寫的,因爲我在運行時需要它們,並且當我嘗試在Scala中嘗試使用它時,我得到了一條警告,建議使用Java。如何從Scala中的ClassFileAnnotArg提取信息2.10
我已經成功地爲每個構造函數參數和註釋獲得了一個符號......但是我最終得到了ClassFileAnnotArg(下面代碼中的av)類型的東西。我不知道如何處理這些。看看源代碼/ scaladocs,看起來我想分解一些case類,但是我不知道如何去做。
我不認爲這個問題是特定於構造函數參數的註解,但我想爲他們使用更詳細的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迭代/檢查它是你想要的/以某種方式匹配預期類型的結果/得到結果?
謝謝。我可以匹配類似'av match {case l:universe.LiteralAnnotArg =>'的代碼,但是我得到了一個關於類型擦除的編譯器警告:類型模式中的_abstract類型reflect.runtime.universe.LiteralAnnotArg reflect.runtime.universe.LiteralAnnotArg未被選中因爲它被erasure_ –
消除了如果'import universe._'並嘗試重新編譯會怎麼樣?警告仍然存在嗎? –
這確實會使警告消失。 (我不明白爲什麼) –