Обязательные поля в спящем объекте - PullRequest
0 голосов
/ 12 декабря 2011

У меня есть Person бин с обязательными ssn и пол в качестве обязательных полей

@Entity
public class Person {
    @Id
    private Long id;
    @NotNull
    private String ssn;//This is mandatory
    @NotNull
    private Gender gender;//This is mandatory
    private String firstname;
    private Date dateOfBirth;
    ...
}

Я в классе MandatoryFieldsFinderу которых нет доступа к человеку Object, есть ли способ узнать эти обязательные поля во время выполнения в спящем режиме или с помощью отражения?Я новичок в Reflection и не хочу его использовать.

public class MandatoryFieldsFinder{

    public list getAllMandatoryFieldsFromPerson(){
    ....
    //I need to find the mandatory fields in Person class here
    ...
    }
}

Ответы [ 2 ]

1 голос
/ 12 декабря 2011

Если вы хотите сделать это во время выполнения, единственный способ - это использовать отражение (на самом деле это довольно забавно, когда вы освоите его!).Это должен делать простой служебный метод, подобный следующему:

/**
 * 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 позаботится о вас.

0 голосов
/ 12 декабря 2011

Вы можете запросить наличие аннотации в поле:

  // walk through fields
    for (Field field : extractFields(target)) {

        final InjectView annotation = field.getAnnotation(InjectView.class);
        if (annotation != null) {

... сделать все необходимое}}

https://github.com/ko5tik/andject/blob/master/src/main/java/de/pribluda/android/andject/ViewInjector.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...