2016-12-16 91 views
1

我有一個案例類,如:使用反射獲取案例類註釋?

case class Foo (@Annotation bar: String) 

我希望能夠獲得訪問該註釋和它的任何信息存儲

我可以得到的情況下訪問器使用反射階(使用2.11.8)與

val caseAccessors = 
    universe.typeTag[T]. 
    tpe. 
    decls. 
    filter(_.isMethod). 
    map(_.asMethod). 
    filter(_.isCaseAccessor) 

但是當我嘗試和他們訪問.annotations沒有什麼。我意識到註釋技術上是在構造函數參數上,但我該如何解決?

+0

您的註釋是否擴展'scala.annotation.StaticAnnotation'? –

+0

不,這些是另一個庫中的java註釋,它們對它們具有運行時保留 – devshorts

回答

2

您的@Annotation將位於構造函數參數和伴隨對象apply方法中,您可以按名稱查找這些方法。我不認爲存在具體的方法來過濾掉構造函數/主構造函數/伴隨對象工廠方法。這兩個應該工作:

universe.typeTag[Foo] 
    .tpe 
    .declarations 
    .find(_.name.toString == "<init>") 
    .get 
    .asMethod 
    .paramss 
    .flatten 
    .flatMap(_.annotations) 

universe.typeTag[Foo.type] 
    .tpe 
    .declarations 
    .find(_.name.toString == "apply") 
    .get 
    .asMethod 
    .paramss 
    .flatten 
    .flatMap(_.annotations) 

(雖然我在斯卡拉2.11.8,而且也沒有decls但有declarations

如果你想要把你的註解字段或干將,使用scala.annotation.meta包:

import scala.annotation.meta 
case class Foo (@(Annotation @meta.getter) bar: String) 

在這種情況下,你的代碼就可以了(如果你在typeTag[T]改變TFoo

請參閱文檔scala.annotation.meta

+0

不錯,唯一對我有用的東西......但是我怎樣才能將它與case類的成員值連接? – bashan