实体类是Java开发中常见的一种类写法,主要用于和数据表做映射。
实体一般满足以下条件:
1、所有成员变量都是私有的。
2、提供无参数构造方法。
3、提供get和set方法。
java.util.Map使用键-值对来存储数据,是一种通用、灵活的数据存储方式,对于一些临时数据、不可预见的展示数据(如Excel工作表的表头),可以使用Map来封装。实体类和Map是优势互补的关系,所以在开发中应合理使用两者。
1、创建实体类Cat。
package com.myself.test; import java.util.List; public class Cat { private String name; private int age; private double weight; private List<String> CatSon; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getWeight() { return weight; } public void setWeight(double weight) { this.weight = weight; } public List<String> getCatSon() { return CatSon; } public void setCatSon(List<String> catSon) { CatSon = catSon; } @Override public String toString() { return "Cat{" + "name='" + name + '\'' + ", age=" + age + ", weight=" + weight + ", CatSon=" + CatSon + '}'; } }
java类默认有无参构造方法,所以可以不写无参构造方法。有参构造方法存在时,必须写无参构造方法。
2、工具类
仅作为学习参考,若要用于生产环境,还需优化。
package com.myself.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.*; public class JavaBeanUtils { public static void main(String[] args) { List<String> sonlist = new ArrayList<>(); sonlist.add("TomSon1"); sonlist.add("TomSon2"); Cat tom = new Cat(); tom.setName("Tomcat"); tom.setAge(5); tom.setWeight(10.15); tom.setCatSon(sonlist); System.out.println("实体类:" + tom.toString()); Map<String, Object> map = JavaBean2Map(tom); System.out.println("实体类转Map:" + map); Cat cat = new Cat(); Map2JavaBean(map, cat); System.out.println("Map转实体类:" + cat.toString()); } public static Map<String, Object> JavaBean2Map(Object obj) { Map<String, Object> map = new LinkedHashMap<>(); try { Class bean = obj.getClass(); Field[] fields = bean.getDeclaredFields(); for (Field field : fields) { String key = field.getName(); Method method = bean.getDeclaredMethod("get" + upperFirstLatter(key)); Object value = method.invoke(obj); map.put(key, value); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return map; } public static Object Map2JavaBean(Map<String, Object> map, Object obj) { try { Class bean = obj.getClass(); Field[] fields = bean.getDeclaredFields(); for (Field field : fields) { String key = field.getName(); Class type = field.getType(); Method method = bean.getDeclaredMethod("set" + upperFirstLatter(key), type); Object value = method.invoke(obj, map.get(key)); } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } return obj; } private static String upperFirstLatter(String name) { return name.substring(0, 1).toUpperCase() + name.substring(1); } }
以上写法要求get和set的方法名必须是get或set拼接首字母大写的成员变量,一般集成开发环境下(eclipse、IDEA)自动生成的方法都符合这个规律。 以上代码用到了反射机制获取成员变量、属性、调用方法的功能。
以下是程序的执行输出结果: