サードパーティの注釈プリプロセッサで生成されたいくつかのJavaクラスに基づいてスカラークラスを構築しようとしています。マクロ注釈の引数としてクラスを取ることができます
私は、例えば注釈付きオブジェクトからクラスへの「点」のことができるようにしたい:私は実際のマクロの実装によ一度
@MyAnnotation(classOf[GeneratedJavaClass]) object MyObject
または
@MyAnnotation object MyObject extends PlaceHolderTrait[GeneratedJavaClass]
私はGeneratedJavaClassを反映して、MyObjectの実装を構築するために使用するメンバーを探したいと思います。
これまでのところ、私の出発点はhttps://github.com/travisbrown/type-provider-examples/blob/master/rdfs-public/src/main/scala/public/PrefixGenerator.scalaに基づいています。
私は、アノテーションの引数としてクラス[T]を取り、その後、Apply(Select(Apply(_, List(TypeApply(_, List(catalog)))), _), _)
でc.macroApplication
に一致する可能性がどのように理解しようとしましたが、私が得るタイプがTypeApply(_, List(Trees$Ident)
であると私は取得する方法が表示されませんそこからのクラス(classOf [T]はリテラルではないと仮定します)。
代わりに、私は、私がオブジェクトを拡張している特性から私が望むタイプを抽出しようとしていると思った。私はcase List(q"object $name extends PlaceHolderTrait[$parent] { ..$body }")
に対してannoteeをマッチさせようとしましたが、再びTree $ Identで終わり、参照されているクラスを取得する方法がわかりません。
おそらく、完全修飾名の文字列を渡してクラスを取得するためにリフレクションを使用することができたことがわかりましたが、私はより良い方法を望んでいました。私はクラスを指定するための2つの選択肢に縛られていないことに注意してください。これは私が思いついた2つの選択肢です。
誰かがこれを行う方法が醜い人なら、私は自分の答えを受け入れずに受け入れますが、私の場合はうまくいく。 –