Java 如何使用反射获取类的某些字段

Java 如何使用反射获取类的某些字段,java,reflection,Java,Reflection,我有一个名为Person.java的类,它有自己的变量,还指向一些引用的类。看看下面的变量 public class Person extends BaseModel { private static final long serialVersionUID = 1L; private Date dateOfBirth; private String aadhaarNumber; private Set<EducationQualification> educationQualif

我有一个名为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;
}
所以,如果它是一个静态变量,我可以检查它是否是静态变量,但我如何检查它是否是一个引用字段

有人能帮我解决疑问吗?请把我卡在这里。

您可以使用方法确定字段的类型,然后只使用必填字段。对于这个particualr场景,您可以检查fieldif类型是Date还是String

编辑:

使用注释+反射

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

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

}   
步骤2:用DesiredField注释适当的字段,您应该像这样注释dateOfBirth和AadharNumber

public class Person extends BaseModel {

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

    private Set<EducationQualification> educationQualifications;

    // Rest of the fields and methods

}
这可能会有所帮助:

您可以使用方法确定字段的类型,然后只使用必填字段。对于这个particualr场景,您可以检查fieldif类型是Date还是String

编辑:

使用注释+反射

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

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

}   
步骤2:用DesiredField注释适当的字段,您应该像这样注释dateOfBirth和AadharNumber

public class Person extends BaseModel {

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

    private Set<EducationQualification> educationQualifications;

    // Rest of the fields and methods

}
这可能会有所帮助:

看一看。此方法将只提供在给定类中声明的字段;继承的字段不会返回

此方法为您提供一个对象数组。使用和中的实用程序方法,例如,Modifier.isStatic。。。您可以找到字段是否为私有、静态、同步等。请查看。此方法将只提供在给定类中声明的字段;继承的字段不会返回


此方法为您提供一个对象数组。使用和中的实用程序方法,例如,Modifier.isStatic。。。您可以查找字段是否为私有、静态、同步等。

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

 Field f1 = BaseModel.class.getDeclaredField("dateOfBirth");
 Field f2 = BaseModel.class.getDeclaredField("aadhaarNumber");
检索修改器以进行进一步检查:

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

等等。

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

 Field f1 = BaseModel.class.getDeclaredField("dateOfBirth");
 Field f2 = BaseModel.class.getDeclaredField("aadhaarNumber");
检索修改器以进行进一步检查:

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

以获得选定字段的反射

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())

获取选定字段的反射的步骤

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())

您可以用注释标记它们,或者检查它们的类型以找到它们。但除此之外,我不确定你的确切意思,你想要的两个字段没有任何特殊之处,因此如果没有名称或某种注释,你将无法获得它们。你看到了吗?这两个字段没有特殊意义。我正在使用特定对象的字段构建查询。因此,需要以动态的方式进行查询构建。代码应该是可重用的。所以我知道类名,所以我需要从这样的人那里构建一个查询,比如selectid,number,dob。这就是为什么我需要与该类相关的字段,而不是该类中的其他引用。那么我如何才能做到这一点呢……你可以用注释来标记它们,或者检查它们的类型以找到它们。但除此之外,我不确定你的确切意思,你想要的两个字段没有任何特殊之处,因此如果没有名称或某种注释,你将无法获得它们。你看到了吗?这两个字段没有特殊意义。我正在使用特定对象的字段构建查询。因此,需要以动态的方式进行查询构建。代码应该是可重用的。所以我知道类名,所以我需要从这样的人那里构建一个查询,比如selectid,number,dob。这就是为什么我需要与该类相关的字段,而不是该类中的其他引用。那么我怎样才能做到这一点呢…检查结果类型:Thanx Karna,但是如果我使用getGenericType,我需要在正确的地方硬编码所有类型。我不想硬编码任何东西。有没有办法不硬编码这些值。。。?“如果我错了,请纠正我……”阿马尔:是的,但是你想考虑的领域和其他领域之间有什么区别呢?正如Andre在评论中提到的,您可以在字段上使用一些注释来实现相同的效果。@Karna thanx用于更新。您说过在字段上使用一些注释可以实现相同的效果。在我的java/pojo类中可以使用什么样的注释以及如何使用…?Thanx@Karna我喜欢这种方法。要检查结果类型:Thanx Karna,但是如果我使用getGenericType,我需要在正确的地方硬编码所有类型。我不想硬编码任何东西。有没有办法不硬编码这些值。。。?“如果我错了,请纠正我……”阿马尔:是的,但是你想考虑的领域和其他领域之间有什么区别呢?正如Andre在评论中提到的,您可以在字段上使用一些注释来实现相同的效果。@Karna thanx用于更新。你说用番荔枝
在字段上实现相同的操作。我们可以在java/pojo类中使用什么样的注释以及如何使用…?Thanx@Karna我喜欢这种方法。