2012-10-27 1 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))) 

,이

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

는, 다음과 같은 코드가 작동해야 인쇄 (Test 주석) :

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