实体设计的时候, 可能会给部分字段添加一些默认值, 这些默认值会节省一些我们的操作, 但是有时候因为业务或者程序设计的需要, 我们想得到一个没有任何默认值的实体.
注意:
1. 所有属性都使用对象类型, int等基础类型可以使用包装类型
2. final字段不做处理
/**
* 构造一个没有默认值的实体
*/
public static Object GenerateNullValuePojo(Class clazz){
Object obj;
try {
obj = clazz.newInstance();
} catch (Exception e) {
// 需要在类上添加lombok的@Slf4j注解
log.error(String.format("反射生成实体失败, error=%s", e.getMessage()), e);
throw new RuntimeException("反射生成实体失败");
}
// 获取实体的所有属性(自身+所有父类)
List<Field> fieldList = new ArrayList<>();
do {
fieldList.addAll(Arrays.asList(clazz.getDeclaredFields()));
clazz = clazz.getSuperclass();
} while (clazz != Object.class); // 当父类为object时, 不再获取属性
for (Field field : fieldList) {
// 私有属性可访问
field.setAccessible(true);
try {
// 不对final字段修改
if (!Modifier.isFinal(field.getModifiers())) {
// 字段值设置为null,需要所有属性为对象类型如integer
field.set(obj, null);
}
} catch (IllegalAccessException e) {
log.error("设置属性值为null失败, filedName={}", field.getName());
}
}
return obj;
}