我有一个必填项,其必填字段包含必填的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;
    ...
}


我在无法访问person对象的类MandatoryFieldsFinder中,有没有办法在运行时以休眠方式或使用反射方式找出这些必填字段?我是Reflection中的一个新手,并且不想使用它。

public class MandatoryFieldsFinder{

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

最佳答案

如果要在运行时执行此操作,则唯一的方法是使用反射(当您掌握了它时,它实际上很有趣!)。像下面这样的简单实用程序方法应该可以做到:

/**
 * 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)


但是请注意,并非所有注释都在运行时可用-这取决于它们的retention policy。如果@NotNull的保留策略为RUNTIME,则可以,否则,您必须在编译时执行一些操作。

我很想知道为什么您首先需要此信息-通常,JSR303 bean验证将为您处理这些信息。

09-30 20:51