我有一个必填项,其必填字段包含必填的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验证将为您处理这些信息。