1

考虑这个例子

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

trait Listener {

  @Listen
  def runMe = {
    ...
  }
}

我正在编写自省代码来查找给定类(即FooListener)的所有方法,这些方法都用某个注释(即@Listen)进行了注释。它们将在某些情况下被调用。所以我需要他们所有的java.lang.Method实例。

在 FooListener 类中很容易找到这些方法。也很容易找到那些超类。

问题是如何找到那些继承自特征的?以及特质的特质?ETC...

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 回答