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입니다.
나는 손실이 많습니다. 필드를 제대로 검색 할 수 있으면 (주석을 볼 수없는 필드 (값을 얻고 설정하는 것, 예 : 보안이 아닌 것)도 이해할 수없는 이유가 무엇인지 이해할 수 없습니다. . 대신이 하나의
첫 번째 방법은 일 :
을이, 일을 반복하려고하지 않는 경우 주석을 선언 (c.getDeclaredFields() 사용. 왜이게 뭔지 아십니까? – jpredham
솔루션이 작동하지 않아 clazz.getFields()가 반환됩니다. 공용 액세스 가능 필드. 그러나 clazz.getDeclaredFields()는 모든 필드를 반환합니다. 자세한 정보는 javadoc을 확인하십시오.) – WeMakeSoftware