2012-09-25 25 views
2

我想在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迭代/檢查它是你想要的/以某種方式匹配預期類型的​​結果/得到結果?

回答

1

目前,您無法獲得註釋對象的實例,儘管這是個不錯的主意。我會盡力在RC1之前擠入它。 UPD。糟糕,我們現在處於鎖定狀態。這將不得不等待,直到2.10.1:https://issues.scala-lang.org/browse/SI-6423

的傳統方法是對av模式對陣LiteralAnnotArgArrayAnnotArgNestedAnnotArg(順便說一句,這些名字將在RC1改爲只LiteralArgumentArrayArgument和`NestedArgument)。

+0

謝謝。我可以匹配類似'av match {case l:universe.LiteralAnnotArg =>'的代碼,但是我得到了一個關於類型擦除的編譯器警告:類型模式中的_abstract類型reflect.runtime.universe.LiteralAnnotArg reflect.runtime.universe.LiteralAnnotArg未被選中因爲它被erasure_ –

+0

消除了如果'import universe._'並嘗試重新編譯會怎麼樣?警告仍然存在嗎? –

+0

這確實會使警告消失。 (我不明白爲什麼) –