一、通过反射,获取实体基本数据类型字段,并给其设置默认值
一般数据库有设置默认值的话 可以通过数据来处理, 如果数据库没有默认值的话 这需要手动设置,如果一个一个字段来写则很浪费时间,可以通过如下方式来实现
主要分为三步来处理,
- 通过反射获取实体的所有字段
private static final Map<Class<?>, List<Field>> FIELD_CACHES = new HashMap<>(100);
/**
* 获取所有字段
*
* @param clazz 反射对象
* @return 对象字段 带缓存
*/
public static List<Field> getDeclaredFields(Class<?> clazz) {
Assert.notNull(clazz, "Class must not be null");
List<Field> list = FIELD_CACHES.get(clazz);
if (list == null) {
try {
Field[] currentFields = clazz.getDeclaredFields();
list = new ArrayList<>(Arrays.asList(currentFields));
Class<?> superClass = clazz.getSuperclass();
if (superClass != null) {
Field[] superFields = superClass.getDeclaredFields();
list.addAll(new ArrayList<>(Arrays.asList(superFields)));
}
FIELD_CACHES.put(clazz, list);
} catch (Throwable var3) {
throw new IllegalStateException(
"Failed to introspect Class [" + clazz.getName() + "] from ClassLoader ["
+ clazz.getClassLoader() + "]", var3);
}
}
return list;
}
- 获取所有的字段和期对应的属性
/**
* 获取属性 和值
*
* @param obj 反射对象
* @return 属性和值 MAP
*/
public static Map<String, AliasValue> getPropertyAndValue(Object obj) {
Class<?> tClass = obj.getClass();
List<Field> fields = getDeclaredFields(tClass);
Map<String, AliasValue> map = new HashMap<>(fields.size());
String alias = "";
if (tClass.isAnnotationPresent(TableAlias.class)) {
TableAlias tableAlias = tClass.getAnnotation(TableAlias.class);
alias = tableAlias.value();
}
for (Field field : fields) {
// 排除serialVersionUID
if (Modifier.isStatic(field.getModifiers())) {
continue;
}
try {
field.setAccessible(true);
// 抛弃null
Object value = field.get(obj);
if (value == null) {
continue;
}
map.put(field.getName(), new AliasValue(value, alias));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return map;
}
- 根据属性值设置期默认值
/**
* 设置对象属性默认值
*
* @param clazz clazz
* @param obj obj
*/
public static void setDefaultFiledValue(Class<?> clazz, Object obj) {
if (obj == null) {
throw new BaseException(BaseCodeEnum.DATA_NOT_EXISTS);
}
//获取所有属性
List<Field> fields = getDeclaredFields(clazz);
//获取属性值
Map<String, AliasValue> valueMap = getPropertyAndValue(obj);
for (Field field : fields) {
if (valueMap.get(field.getName()) == null) {
try {
field.setAccessible(true);
if (String.class.equals(field.getType())) {
field.set(obj, DefaultConstant.STRING);
continue;
}
if (BigDecimal.class.equals(field.getType())) {
field.set(obj, DefaultConstant.BIG_DECIMAL);
continue;
}
if (Integer.class.equals(field.getType())) {
field.set(obj, DefaultConstant.INTEGER);
continue;
}
if (Long.class.equals(field.getType())) {
field.set(obj, DefaultConstant.LONG);
continue;
}
if (LocalDateTime.class.equals(field.getType())) {
field.set(obj, DefaultConstant.DATE_TIME);
continue;
}
if (LocalDate.class.equals(field.getType())) {
field.set(obj, DefaultConstant.DATE);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}