最近的这个项目是使用的springMVC+mybatis,在service层往dao层传map的时候每次都要把Object的各个属性判断写一遍太麻烦了,就写了这么一个工具类。
它的作用是:将自定义的Object类中的个各属性当其值不为null时,以其属性名为key,对应的值为value存入一个map中返回
一、如何获取类的各个属性名
Class<?>有一个getDeclaredFields()方法,能获取Field数组
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
String fieldName = field.getName();
String type = field.getType().toString();
System.out.println("属性名:"+fieldName+"\t属性类型:"+type);
}
其实Field还有蛮多方法的,有兴趣的可以去问问百度。
二、通过属性名称获取该对象该属性所对应的值
这里我使用的是java的invoke反射
//获取该属性的get方法名称
String firstLetter=fieldName.substring(0,1).toUpperCase();
String getter = "get"+firstLetter+fieldName.substring(1);
try {
Method method = object.getClass().getMethod(getter, new Class[]{});
Object value = method.invoke(object, new Object[] {});
return value;
} catch (Exception e) {
return null;
}
其实可以看出来,这里的方法其实是有局限性的,我所获取的getter只适用于完全按照规范的get方法,并且该属性不能为Boolean。因为Boolean属性的get方法为isXxx()。
当然你可以更改get方法名称,但是我更推荐在代码逻辑上改,可以通过type判断属性类型,如果为Boolean就讲getter的拼接规则变一下。
三、将键值对放入map
这里因为我主要是做模糊查询,所以对String类型的值做了不同的操作,所以要判断属性类型。如果还有对其它类型(如:data)有要求的也应单独判断。因为很简单就直接附代码了。
public class ClassUtil {
/**
* 将一个类查询方式加入map(属性值为int型时,0时不加入,
* 属性值为String型或Long时为null和“”不加入)
*
*/
public static Map<String, Object> setConditionMap(Object obj){
Map<String, Object> map = new HashMap<String, Object>();
if(obj==null){
return null;
}
Field[] fields = obj.getClass().getDeclaredFields();
for(Field field : fields){
String fieldName = field.getName();
if(getValueByFieldName(fieldName,obj)!=null)
map.put(fieldName, getValueByFieldName(fieldName,obj));
}
return map;
}
/**
* 根据属性名获取该类此属性的值
* @param fieldName
* @param object
* @return
*/
private static Object getValueByFieldName(String fieldName,Object object){
String firstLetter=fieldName.substring(0,1).toUpperCase();
String getter = "get"+firstLetter+fieldName.substring(1);
try {
Method method = object.getClass().getMethod(getter, new Class[]{});
Object value = method.invoke(object, new Object[] {});
return value;
} catch (Exception e) {
return null;
}
}
}