1

例を考えてみましょう

class FooListener extends Listener {
  @Listen
  def runMeToo = {
    ...
  }
}

trait Listener {

  @Listen
  def runMe = {
    ...
  }
}

特定のアノテーション(つまり@Listen )でアノテーションが付けられた特定のクラス(つまりFooListener )のすべてのメソッドを見つけるためのイントロスペクションコードを書いています。それらは特定の状況下で呼び出されます。したがって、すべてのjava.lang.Methodインスタンスが必要です。

FooListenerクラスでこれらのメソッドを見つけるのは簡単です。スーパークラスのものも簡単に見つかります。

問題は、形質から受け継いだものをどのように見つけるかです。そして、その特徴の特徴は?等...

4

2 に答える 2

1

トレイトから継承されたメソッドは、クラスにコピーされるだけです。したがって、クラスのメソッドをリストするだけでそれらを見つけることができます。

val ms = classOf[FooListener].getMethods()

そして、それらに注釈を付けて印刷します。

ms.foreach(m => m.getDeclaredAnnotations().foreach(a => println(m + " " + a)))

私の場合(で注釈が付けられていTestます)、これは

public void util.FooListener.runMe() @org.junit.Test(expected=class org.junit.Test$None, timeout=0)
public void util.FooListener.runMeToo() @org.junit.Test(expected=class org.junit.Test$None, timeout=0)
于 2012-10-27T15:03:04.913 に答える
1

トレイトはJavaのインターフェースに変換されるため、次のコードスニペットが機能するはずです。

val methods = classOf[FooListener].getInterfaces flatMap {intf =>
    intf.getMethods filter {_.getAnnotation(classOf[Listen]) != null}
}
于 2012-10-27T15:05:34.917 に答える