java 利用反射填充创建时间、ip等字段

利用反射填充实体类的创建时间、更新时间等

背景

当需要手动插入一个实体类数据的时候,插入创建时间,一个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;
			}
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值