我有一个与此相似的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
。我该怎么做 ?
答案 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块来处理此代码。并非类中的所有对象都可能具有默认构造函数,在这种情况下,您可能需要进一步自定义代码。