2012-10-27 145 views
1

考慮例如反思斯卡拉性狀

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

trait Listener { 

    @Listen 
    def runMe = { 
    ... 
    } 
} 

我寫自省代碼找到一個給定類的所有方法具有一定的註釋(即@Listen)註釋(即FooListener的)。他們會在某些情況下被調用。所以我需要他們所有的java.lang.Method實例。

在FooListener類中很容易找到這些方法。容易也找到那些超類。

問題是如何找到從特質繼承的那些?而這些特質的特點呢?等...

回答

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) 
+0

這個作品! (對不起,我遲到了)然而,有關私人方法的任何線索? –

1

由於性狀折算爲Java接口,下面的代碼片段應該工作:

val methods = classOf[FooListener].getInterfaces flatMap {intf => 
    intf.getMethods filter {_.getAnnotation(classOf[Listen]) != null} 
}