利用反射填充实体类的创建时间、更新时间等
背景
当需要手动插入一个实体类数据的时候,插入创建时间,一个setCreateTime(new Data())就可以完成,但是如果有更多的字段,比如:主键id、更新时间、ip地址、创建人、创建人id、更新人等这些字段,一个一个写就非常不优雅,我们可以建一个Common的一个微服务,里面写一个方法,利用反射去进行数据的填充,下面是代码展示。
了解代码前提条件
- 了解jsp
- 了解反射机制
- 了解我讲解的id生成器(不是必须)
EntityUtil代码
//传入一个实体
public static| <T> void setCreatelnfo(T entity){
generateDefaultid(entity);
String hostIp = "127.0.0.1";
String name = "";
String id = "";
//判断请求头中是否带有信息
if(RequestContextHolder.getRequestAttrinutes() !=null){
HttpServletRequest request = ((ServleteRequestAttributes)RequestContextHolder.getRequestAttributes());
//ClentUtils写的这个方法就是从请求头获取ip的
hostIp = (String) StringUtils.defaultIfBlank(request.getHeader("userHost"),ClentUtils.getClientIp());
name = StringUtils.trimToEmpty(request.getHeader("name"));
name = URLDecoder.decode(name);
id= StringUtils.trimToEmpty(request.getHeader("userId"));
if(StringUtils.isBlank(name)){
if(StringUtils.isBlank(BaseContexHandler.getName())){
return BaseContexHandler.getName();
}else{
name = "system";
}
}
if(StringUtils.isBlank(id)){
if(StringUtils.isBlank(BaseContexHandler.getUserID())){
id = BaseContexHandler.getUserID();
}else{
//代表匿名
id= "-1";
}
}
String[] fields = new String[]{"creator","creatorId","createdHostIp","createTime"};
Field field = ReflectionUtil.getAccessibleField(entity,"createTime");
Object value = null;
if(field !=null && field.getType.equals(Date.class)){
value = new Object[]{name,StringUtil.isNotBlank(id)? Long.valueOf(id):null,hostIp,new Date()};
}
setDefaultValues(entity,fields,value);
}
}
void generateDefaultid(T entity){
if(!isPKNotNull(entity,"id")){
//如果实体类的id属性的值为空,利用反射和set去进行填充
ReflectionUtil.invokeSetter(entity,"id",IdUtil.generateId);
}
}
boolean isPKNotNull(T entity,String field){
if(!ReflectionUtil.hasField(entity,field)){
return false;
}else{
Object value = ReflectionUtil.getFieldValue(entity,field);
return value !=null && !"".equals(value);
}
}
void setDefaultValues(T entity,String fields,Object[] value){
for(int i=0;i<fields.length;++i){
String field = fields[i];
if(ReflectionUtil.hasFieldValue(entity,field) && value[i] != null && value[i] != ""){
ReflectionUtil.invokeSetter(entity,"field ",value[i]);
}
}
}
ReflectionUtil类
boolean hasField(final Object obj,final String fieldName){
Field field = getAccessibleField(obj,fieldName);
return field!=null;
}
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 +"]" );
}else{
Object result = null;
result = field.get(obj);
return result;
}
return field!=null;
}
boolen hasFieldValue(final Object obj,final String fieldName){
Field field = getAccessibleField(obj,fieldName);
if(field == null){
return false;
}
Object value = getFieldValue(obj,fieldName)
if(value != null && fieldName.equals("creator") || fieldName.equals("creatorId"))
}
Field getAccessibleField(final Object obj,final String fieldName){
Validate.notNull(obj,"object can not be null",new Object[0]);
Validate.notNull(fieldName,"fieldName can not be null",new Object[0]);
Class superCLass = obj.getCLass();
while(superCLass != Object.class){
return superCLass .getDeclaredField(fieldName);
}
void invokeSetter(Object obj,String fieldName,Object value){
Object object = obj;
String[] names = StringUtils.split(fieldName,".");
for(int i = 0;i<names;++i){
String getterMethodName;
if(i<names.length - 1){
getterMethodName = "get" + StringUtils.capitalize(names[i]);
object = invokeMethod(object,getterMethodName ,new Class[0], new Obeject[0]);
}
}else{
getterMethodName = "set" + StringUtils.capitalize(names[i]);
invokeMethodByName(object,getterMethodName ,new Object[]{value});
}
}
}
Object invokeMethodByName(final Object obj,final String methodName,final Object[] args){
Method method = getAccessibleMethodByName(obj,methodName);
if(method ==null){
//抛出异常
}
return method.invoke(obj,args);
}
Method getAccessibleMethodByName(Object obj,String methodName){
//判断这两个参数是否为空
for(Class<?> searchType = obj.getClass(); searchType != Object.class;searchType = searchType.getSuperclass()){
Method[] methods = searchType.getDeclaredMethods();
for(Method method : methods){
if(method.getName.equals(methodName)){
return method;
}
}
}
}