리플렉션을 사용하여 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)입니다.
이 기능을 구현하는 데 더 쉽고 효율적인 방법이 있었는지 궁금합니다. 구아바와 아파치 코 몬즈에서 성공적으로 보지 못했습니다 ...
Google Reflections maybe? http://code.google.com/p/reflections/ – biziclop
javadocs를 살펴본 결과 메소드 오버라이드를 확인하는 데 아무 것도 찾지 못했습니다. 좋은 도서관이지만, 나는 그것을 명심해야한다! – Eleaar
최악의 경우 알고리즘을 쉽게 구현할 수 있습니다.:) – biziclop