Если вы хотите сделать это во время выполнения, единственный способ - это использовать отражение (на самом деле это довольно забавно, когда вы освоите его!).Это должен делать простой служебный метод, подобный следующему:
/**
* Gets a List of fields from the class that have the supplied annotation.
*
* @param clazz
* the class to inspect
* @param annotation
* the annotation to look for
* @return the List of fields with the annotation
*/
public static List<Field> getAnnotatedFields(Class<?> clazz,
Class<? extends Annotation> annotation) {
List<Field> annotatedFields = new ArrayList<Field>();
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(annotation)) {
annotatedFields.add(field);
}
}
return annotatedFields;
}
Затем вы можете реализовать свой метод getAllMandatoryFieldsFromPerson()
, используя:
getAnnotatedFields(MyClass.class, NotNull.class)
Обратите внимание, что не все аннотациидоступны во время выполнения - это зависит от их политики хранения .Если @NotNull
имеет политику хранения RUNTIME
, то это нормально, иначе вам придется что-то делать во время компиляции.
Мне было бы интересно, зачем вам эта информация в первую очередь -обычно это то, что валидация bean-компонента JSR303 позаботится о вас.