2011-11-03 3 views
2

추상 추상 클래스의 전용 속성에 상속 된 필드 형식 주석을 만들었습니다.추상 슈퍼 클래스에서 상속 된 주석을 찾지 못했습니다.

@Inherited 
@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface Lifecycle{ 
    Type type(); 
    String name() default ""; 

    public enum Type{ 
     DISCRIMINATOR,INITIAL,MUTABLE 
    } 
} 

나는 (다른 상속 또는)이 유형의 모든 주석을 수집하여 목록으로 반환하고자 서브 클래스에서 메소드를 호출하고 있습니다.

public static <T extends Annotation> List<T> getAnnotation(final Class c, final Class<T> ann) { 
    return getAnnotation(c, ann, new ArrayList<T>()); 
} 

public static <T extends Annotation> List<T> getAnnotation(final Class c, final Class<T> ann, List<T> aList) { 
    Field[] fields = c.getFields(); 
    for (int i = 0; i < fields.length; i++) { 
     Field myField = fields[i]; 
     myField.setAccessible(true); 
     T found = myField.getAnnotation(ann); 
     if (found != null) { 
      aList.add(found); 
     } 
    } 
    if (!c.getSuperclass().equals(Object.class)) { 
     return getAnnotation(c.getSuperclass(), ann, aList); 
    } else { 
     return aList; 
    } 
} 

내게 모르는 어떤 이유로이 방법은 효과가 없습니다. 계승 된 모든 필드가 확실히 발견됩니다. 마찬가지로 상속 구조의 모든 클래스가 순회되지만 어떤 이유로 인해 myField.getAnnotation(ann);은 항상 null입니다.

나는 손실이 많습니다. 필드를 제대로 검색 할 수 있으면 (주석을 볼 수없는 필드 (값을 얻고 설정하는 것, 예 : 보안이 아닌 것)도 이해할 수없는 이유가 무엇인지 이해할 수 없습니다. . 대신이 하나의

답변

2

:

Field[] fields = c.getFields(); 

이 시도 :

for(Annotation annotation : field[i].getDeclaredAnnotations()) { 
... 
} 
+0

첫 번째 방법은 일 :

Field[] fields = c.getDeclaredFields(); 

을이, 일을 반복하려고하지 않는 경우 주석을 선언 (c.getDeclaredFields() 사용. 왜이게 뭔지 아십니까? – jpredham

+0

솔루션이 작동하지 않아 clazz.getFields()가 반환됩니다. 공용 액세스 가능 필드. 그러나 clazz.getDeclaredFields()는 모든 필드를 반환합니다. 자세한 정보는 javadoc을 확인하십시오.) – WeMakeSoftware

관련 문제