StackOverflow の Scala エキスパート。
以下のサンプル コードでは、現在取り組んでいるプロジェクトで直面している動作を再現しました。クラスフィールドメンバーに存在する場合、定義されたアノテーション「武器」ジェネリック型を推測/測定できるはずです。
import scala.reflect.runtime.universe._
import scala.annotation.StaticAnnotation
class Reflection
object Reflection {
def reflect[T: TypeTag](x: Class[T]): Type = {
typeOf[T]
}
def main(args: Array[String]) {
var tpe = reflect(classOf[Hero])
for (member <- tpe.members)
for (annotation <- member.annotations)
annotation.tpe match {
case t if t <:< typeOf[weapon[_]]
=> println(s"found weapon member: $member")
case t if t <:< typeOf[action]
=> println(s"found action member: $member")
}
}
}
class weapon[T <: WeaponType](x: String = null) extends StaticAnnotation
class action extends StaticAnnotation
class WeaponType(damage: Int)
case class Knife extends WeaponType(12)
class Hero {
@weapon[Knife] var weapon: String = _
@action def hitWithKnife() {
}
}
それでも、私が提供したサンプルコードでは、REPL が奇妙なログを出力するのを避けることができませんでした。
[] ?_$1 setInst sample.Knife
前もって感謝します
編集
「@alexwriteshere」は、ログが退屈だった理由を正しく説明してくれました。彼は私の質問が混乱していると私に思わせた。
質問
@weapon で定義された T タイプをクラス メンバーで推測/測定することができます (私の Hero クラスの Weapon メンバーで見られるように)。