遍历对象并为空字段设置值

时间:2019-01-25 18:12:07

标签: java

我有一个与此相似的VO。

public class Job
{
    private Long id;
    private String createdBy;
    private Set<JobStatus> jobStatuses;
}

还有更多类似的字段。我想遍历VO中的字段并为所有没有数据的String字段设置'NA'。到目前为止,这就是我所拥有的。

Job job = getJob();//getting the Job populated
BeanInfo beanInfo = Introspector.getBeanInfo(Job.class);
for (PropertyDescriptor propertyDesc : beanInfo.getPropertyDescriptors()) {
    if (propertyDesc.getReadMethod().invoke(job) == null
        && propertyDesc.getPropertyType() == String.class) {
      propertyDesc.getWriteMethod().invoke(job, "NA");
}}

这很好。但是现在我需要遍历其他字段,这些字段本身就是对象,并且动态地执行相同的操作。像Set<JobStatus> jobStatuses。我该怎么做 ?

3 个答案:

答案 0 :(得分:0)

坦率地说,这只是不好的做法。 如果要将对象保存在数据库中,并且希望将空属性保存为“ NA”(无论出于何种原因),只需将列的默认值设置为“ NA”即可。 您还可以在构造函数中使用属性值='NA'初始化对象,从而节省了遍历对象属性的大量时间。

答案 1 :(得分:0)

如果不使用N / A在构造函数中初始化这些变量,则每个对象上也可以有一个方法将null变量设置为N / A并直接调用它。

答案 2 :(得分:0)

不能将字符串值分配给非String类型的Java对象。但是我假设您可以将默认构造器构造的空对象(如果存在)分配给null属性。在这种假设下,请尝试以下解决方案:

for (PropertyDescriptor propertyDesc : beanInfo.getPropertyDescriptors()) {
    if (propertyDesc.getReadMethod().invoke(job) == null
        && propertyDesc.getPropertyType() == String.class) {
               propertyDesc.getWriteMethod().invoke(job, "NA");
    }
    else if (propertyDesc.getReadMethod().invoke(job) == null
        && propertyDesc.getPropertyType() != String.class) { //Other than String types                   
               propertyDesc.getWriteMethod().invoke(job, propertyDesc.getPropertyType().newInstance());
    }   
} 

不要忘记使用try-catch块来处理此代码。并非类中的所有对象都可能具有默认构造函数,在这种情况下,您可能需要进一步自定义代码。