一、实体类
实体类是Java开发中常见的一种类写法,主要用于和数据表做映射。
实体一般满足以下条件:
1、所有成员变量都是私有的。
2、提供无参数构造方法。
3、提供get和set方法。
二、Map接口
java.util.Map使用键-值对来存储数据,是一种通用、灵活的数据存储方式,对于一些临时数据、不可预见的展示数据(如Excel工作表的表头),可以使用Map来封装。实体类和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)自动生成的方法都符合这个规律。 以上代码用到了反射机制获取成员变量、属性、调用方法的功能。
以下是程序的执行输出结果: