2012-03-12 23 views
5

리플렉션을 사용하여 JSR-330 주석이있는 클래스의 종속성을 확인하려면 처리해야합니다.Java : 리플렉션을 사용하여 메서드가 재정의되었는지 확인하는 방법

스프링, Guice 또는 PicoContainer와 같은 모든 JSR-330 호환 IoC 컨테이너를 완전히 알고 있습니다. 그러나 내가 필요한 것은 의존성을 해결하고 주입하는 것이 아니라이를 확인하는 것이다.

기본적으로 반사 형 클래스 "구문 분석"과 관련하여 JSR-330 구현을 구현해야한다는 것을 의미합니다. @Inject 주석 다른 방법 을 무시 @Inject 주석 방법만을 주입 한 번만 주입한다

: I 구현 약간 번잡 알게 JSR-330 규격의 한 부분이있다

인스턴스 당 요청 이 @Inject로 주석 된 메소드를 대체하는 @Inject 어노테이션이없는 메소드는 삽입되지 않습니다.

즉 하위 클래스는 기본 클래스의 autowiring 계약을 다시 정의 할 수 있으며 (다형성을 통해) 주입 흐름에 연결될 수 있음을 의미합니다.

내 질문은 다음과 같습니다. 클래스 계층 구조가 주어지면 계층 구조의 일부분에서 메소드가 계층 구조에서 더 아래쪽으로 대체되는지 여부를 쉽게 확인할 수 있습니까? 내 경우에는이 작업을 수행 할 것

가장 간단한 방법은 계층 구조의 잎에서 재귀 함께 다음 overriddenBy 구아바 같은 술어로

private List<Method> getInjectableMethods(final Class<?> clazz) { 
    // recursive stop condition 
    if(clazz == null) { 
     return emptyList(); 
    } 

    // recursively get injectable methods from superclass 
    final List<Method> allInjectableMethods = newLinkedList(getInjectableMethods(clazz.getSuperclass())); 
    final List<Method> injectableMethods = newArrayList(); 

    // any overridden method will be present in the final list only if it is injectable in clazz 
    for (final Method method : clazz.getDeclaredMethods()) { 
     removeIf(allInjectableMethods, Methods.Predicates.overriddenBy(method)); 
     if (isInjectable(method)) { 
      injectableMethods.add(method); 
     } 
    } 
    allInjectableMethods.addAll(injectableMethods); 

    return allInjectableMethods; 
} 

, 나는 그것을 확인합니다 :

    클래스를 정의
  • 메소드는 메소드 이름이 동일한
  • 방법 공식 PARAM는
  • 일지 어떨지 관계에 eters가 동일 함

결과 복잡성은 계층 구조의 메소드 수와 관련하여 O (n^2)입니다.

이 기능을 구현하는 데 더 쉽고 효율적인 방법이 있었는지 궁금합니다. 구아바와 아파치 코 몬즈에서 성공적으로 보지 못했습니다 ...

+0

Google Reflections maybe? http://code.google.com/p/reflections/ – biziclop

+0

javadocs를 살펴본 결과 메소드 오버라이드를 확인하는 데 아무 것도 찾지 못했습니다. 좋은 도서관이지만, 나는 그것을 명심해야한다! – Eleaar

+0

최악의 경우 알고리즘을 쉽게 구현할 수 있습니다.:) – biziclop

답변

1

불행히도 클래스 그래프는 루트 방향에서만 탐색 할 수 있습니다. 따라서 특정 클래스 로더에서 사용할 수있는 모든 클래스를 검사하는 것을 제외하고는 파생 클래스를 모두 찾을 방법이 없습니다. 항상 구체적인 구현을 알고 있기 때문에 IoC 컨테이너에는이 문제가 없습니다. (구성의 일부 임)

상속 나무는 일반적으로 IDE에 의해 작성되지만 AFAIUK는 사용 가능한 모든 소스/클래스에 대해 brite force indexing을 사용합니다 단서를위한 InteliiJ IDEA의 커뮤니티 편집 소스를 살펴보십시오.)

관련 문제