2016-12-16 3 views
1

私のようなケースクラスを持っている:リバースでケースクラス注釈を取得しますか?

case class Foo (@Annotation bar: String) 

私はその注釈へのアクセスを取得できるようにしたいと

に格納され、その情報のいずれかと思い、私はケースは、Scalaのリフレクションを使用してアクセサ得ることができます

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

と(2.11.8を使用して)しかし、私は彼らに試してみて、アクセス.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) 

を(私はScalaの2.11.8にだと何declsありませんが、declarationsありますが)

あなたは、フィールドまたはゲッターであなたの注釈を入れscala.annotation.metaパッケージを使用する場合:

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

(あなたがtypeTag[T]FooTを変更した場合)この場合、あなたのコードは動作しますが

のドキュメントを参照scala.annotation.meta

+0

私にとってはうまくいった唯一のもの...しかし、それをケースクラスのメンバー値とどのように結びつけることができますか? – bashan

関連する問題