2

Scala 2.10M7 の新しいリフレクション API を使用して、コンストラクター引数の注釈を抽出しようとしています。注釈は、実行時に必要な Java で記述されており、Scala で実行しようとすると、Java を使用することを推奨する警告が表示されました。

各コンストラクター引数と注釈のシンボルを正常に取得しました...しかし、最終的に ClassFileAnnotArg タイプのものになります(以下のコードの av )。これらをどうするかわかりません。ソース コード/scaladoc を見ると、いくつかのケース クラスに分割したいように見えますが、その方法がわかりませんでした。

この質問はコンストラクター引数のアノテーションに固有のものではないと思いますが、より詳細なスカラ リフレクションを使用したかったので、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を通過する必要がありますか/必要なものであることを確認する/ assocを反復処理する/必要なものであることを確認する必要があります/ 何らかの形で結果を予想される型に一致させます / 結果を取得しますか?

4

1 に答える 1

1

現在、アノテーションオブジェクトのインスタンスを取得することはできませんが、それは良い考えです。RC1の前に押し込んでみます。upd。おっと、現在封鎖されています。これは2.10.1まで待たなければなりません:https ://issues.scala-lang.org/browse/SI-6423

従来の方法は、、、およびavに対してパターンマッチングを行うことです(ただし、これらの名前はRC1で、および `NestedArgumentに変更されます)。LiteralAnnotArgArrayAnnotArgNestedAnnotArgLiteralArgumentArrayArgument

于 2012-09-25T09:24:47.473 に答える