如何使用Reflection获取类的某些字段

时间:2013-07-17 06:16:04

标签: java reflection

我有一个名为Person.java的类,它有自己的变量,并且它也指向一些引用的类。看看下面的变量

public class Person extends BaseModel {
private static final long serialVersionUID = 1L;

private Date dateOfBirth;
private String aadhaarNumber;

private Set<EducationQualification> educationQualifications;
private Set<EmploymentExperience> employmentExperiences;
private ContactInformation contactInformation;
private DriversLicense driversLicense;
private PersonName personName;
private Candidate candidate;
private Passport passport;
private Set<Award> awards;
}

这里我使用Java反射获取字段名称。当我使用Class.getDeclaredField()时给出所有字段(上面指定的变量)。但我只想要两个字段

private Date dateOfBirth;
private String aadhaarNumber;

因此,如果它是一个静态变量,我可以检查天气是否为静态但是我如何检查天气是否为参考场?

任何人都可以解决我的疑虑吗?请我坚持到这里。

4 个答案:

答案 0 :(得分:4)

您可以使用getType方法确定字段类型,然后仅使用必填字段。对于此特定情况,您可以检查归档是否为DateString


编辑:

使用注释+反射

第1步:定义自定义注释。这里DesiredField是我们的自定义注释

@Target(value = ElementType.FIELD)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface DesiredField {

}   

第2步:使用DesiredField为相应字段添加注释,您应该注释dateOfBirthaadhaarNumber

public class Person extends BaseModel {

    @DesiredField
    private Date dateOfBirth;
    @DesiredField
    private String aadhaarNumber;

    private Set<EducationQualification> educationQualifications;

    // Rest of the fields and methods

}

第3步:使用反射查找带注释的字段

  Person person = new Person();
  Field[] fields = person.getClass().getFields();

  for(Field field : fields){
      DesiredField annotation = field.getAnnotation(DesiredField.class);
      if( annotation != null ){
          // This is desired field now do what you want
      }
  } 

这可能会有所帮助:http://www.vogella.com/articles/JavaAnnotations/article.html

答案 1 :(得分:0)

看看Class.getDeclaredFields()。此方法仅为您提供在给定类中声明的字段;继承的字段不会被返回。

此方法为您提供了一组Field个对象。使用Field.getModifiers()Modifier中的实用程序方法(例如,Modifier.isStatic(...)),您可以找到字段是私有的,静态的,同步的等等。

答案 2 :(得分:0)

您可以传递字段名称以仅获取该字段:

 Field f1 = BaseModel.class.getDeclaredField("dateOfBirth");
 Field f2 = BaseModel.class.getDeclaredField("aadhaarNumber");

检索Modifier以进一步检查:

 Modifier.isStatic(f1.getModifiers());
 Modifier.isPrivate(f1.getModifiers());

答案 3 :(得分:0)

获取所选字段的反射

Field[] declaredFields = clas.getDeclaredFields();
    List requiredFileds =  Arrays.asList("dateOfBirth","aadhaarNumber");
    for(Field f:declaredFields) {
        if(requiredFileds.contains(f.getName())) {

        }
    }

检查静态字段

java.lang.reflect.Modifier.isStatic(field.getModifiers())