业务代码中会创建大量的类并给创建的类对象的每个字段去赋值,这样才能在接下来的业务中去使用这个对象。最简单的例子:
public class User {
private Integer id;
private String name;
public User() { }
public User(Integer id, String name) {
this.id = id;
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
而在使用的时候我们这样做就可以:
User user = new User( 1, "Alen");
或者:
User user1 = new User();
user1.setId(2);
user1.setName("Bob");
但这只是最简单的类(只有两个字段),所以我们创建对象也不会感到麻烦。但如果一个类拥有数十上百个字段的时候呢?以上两种方法用起来就有点繁琐了。在实际业务需求实现中,可以将原数据先转换为Map<String, String>的形式,然后利用Java反射的原理去简化这个操作:
public static Object getObject(Object object, Map<String, String> map){
Set<String> keySet = map.keySet();
Field[] declaredFields = object.getClass().getDeclaredFields();
for (Field field : declaredFields) {
try {
Class[] classes = new Class[1];
classes[0] = field.getType();
// System.out.println(field.getName());
Method method = object.getClass().getMethod("set" + upperFirst(field.getName()), classes);
for (String s : keySet) {
if(s.equalsIgnoreCase(field.getName())){
method.invoke(object, map.get(s));
}
}
// System.out.println(method.getName());
} catch (Exception e) {
e.printStackTrace();
}
}
return object;
}
public static String upperFirst(String name){
String s = name.substring(0, 1);
return s.toUpperCase() + name.substring(1);
}
代码中的Object类就是实际业务中的类,直接替换掉就好了。另外需要注意一点:需要获取的类每个字段必须创建set方法,否则无法实现。
但是我们也注意到以上样例代码中只考虑了对象字段类型为String的情况,而实际应用中会用到不同的字段类型Integer, Long, BigDecimal等,这种时候就要考虑到不同数据类型的处理了:
假设我们创建了一个类TableDataClass,其中字段包含String, Integer, Long, BigDecimal, Float, Timestamp几种类型,这种时候我们怎么处理呢?
public static TableDataClass getObject1(Map<String, String> map) throws Exception{
Set<String> keySet = map.keySet();
TableDataClass tableDataClass = new TableDataClass();
Field[] declaredFields = tableDataClass.getClass().getDeclaredFields();
for (Field declaredField : declaredFields){
Class[] classes = new Class[1];
classes[0] = declaredField.getType();
Method method = tableDataClass.getClass().getMethod("set" + upperFirst(declaredField.getName()), classes);
for (String s : map.keySet()){
if (declaredField.getName().equalsIgnoreCase(GetObjUtil.paramNameDeal(s))){
String o = map.get(s);
if (o == null){
continue;
}
switch (declaredField.getType().getName()){
case "java.lang.Integer":
method.invoke(tableDataClass, Integer.parseInt(o));
break;
case "java.lang.String":
method.invoke(tableDataClass, (String) o);
break;
case "java.lang.Long":
method.invoke(tableDataClass, Long.parseLong(o));
break;
case "java.math.BigDecimal":
method.invoke(tableDataClass, new BigDecimal( o));
break;
case "java.lang.Double":
method.invoke(tableDataClass, Double.parseDouble(o));
break;
case "java.lang.Float":
method.invoke(tableDataClass, Float.parseFloat(o));
break;
case "java.sql.Timestamp":
method.invoke(tableDataClass, new Timestamp(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(o).getTime()));
break;
}
break;
}
}
}
return tableDataClass;
}
以上就是将Map<String, String>自动转为类对象的方法,只要将类的字段类型都在switch中作以对应处理就可以,这个方法适用几乎所有类。有了这个工具,数据转对象的操作就简化了很多。当然在实际应用中由于具体业务情况不同,代码也需要做相应的调整,这个在使用过程中按需增删处理逻辑就好了。