自定义一个拦截器
import java.lang.annotation.*; /** * 需要修改的字段 */ @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ModifyField { ModifyFieldEnum value(); }
定义枚举类
/** * 标记的字段 title代表标题,primyId代表业务主键,JsonFiled代表需要转JSON存储的字段 */ public enum ModifyFieldEnum { TITLE("title"), PRIMYID("primyId"), JSONFILED("JsonFiled"); private String value; ModifyFieldEnum(String value) { this.value = value; } public String getValue() { return value; } }
业务对象里的属性
/** * 支付审批主键 */ @TableId("aprv_id") @ModifyField(ModifyFieldEnum.PRIMYID) private Integer aprvId; public Integer getAprvId() { return aprvId; } public void setAprvId(Integer aprvId) { this.aprvId = aprvId; }
获取对象属性值的方法
/** * 标记的业务ID字段 */ private String getPrimyId(T vo) throws Exception { Field[] fields = vo.getClass().getDeclaredFields(); String primyKey = null; for (Field filed : fields) { ModifyField tableField = filed.getAnnotation(ModifyField.class); if (tableField != null) { if (ModifyFieldEnum.PRIMYID.equals(tableField.value())) { Object object = ReflectionUtils.getFieldValue(vo, filed.getName()); if (object != null) { primyKey = object.toString(); } break; } } } return primyKey; }
getFieldValue方法
/**
* 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数.
*/
public static Object getFieldValue(final Object obj, final String fieldName) {
Field field = getAccessibleField(obj, fieldName);
if (field == null) {
throw new IllegalArgumentException("Could not find field [" + fieldName + "] on target [" + obj + "]");
}
Object result = null;
try {
result = field.get(obj);
} catch (IllegalAccessException e) {
}
return result;
}
getAccessibleField方法
/** * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. * * 如向上转型到Object仍无法找到, 返回null. */ public static Field getAccessibleField(final Object obj, final String fieldName) { Validate.notNull(obj, "object can't be null"); Validate.notBlank(fieldName, "fieldName can't be blank"); for (Class<?> superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) { try { Field field = superClass.getDeclaredField(fieldName); makeAccessible(field); return field; } catch (NoSuchFieldException e) {// NOSONAR // Field不在当前类定义,继续向上转型 continue;// new add } } return null; }
public static void makeAccessible(Field field) { if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) || Modifier .isFinal(field.getModifiers())) && !field.isAccessible()) { field.setAccessible(true); } }