1.什么是java内省机制?
内省(IntroSpector)是Java 语言对 Bean 类属性、事件的一种缺省处理方法。 JavaBean是一种特殊的类,主要用于传递数据信息,这种类中的方法主要用于访问私有的字段,且方法名符合某种命名规则。如果在两个模块之间传递信息,可以将信息封装进JavaBean中,这种对象称为“值对象”(Value Object),或“VO”。方法比较少。这些信息储存在类的私有变量中,通过set()、get()获得。内省机制是通过反射来实现的,BeanInfo用来暴露一个bean的属性、方法和事件,以后我们就可以操纵该JavaBean的属性。
与反射不同的是反射是在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态。
个人肤浅理解,说白了内省主要就是获取类的属性描述器,通过setter、getter方法来操纵成员变量获取和设置值。
2. 说了这么多,直接上干货
2.1定义实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {
private Long id;
private String name;
private boolean admin;
}
2.2集合Map与Bean之间的转换
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("all")
public class JavaBeanDemo {
public static void main(String[] args) throws Exception {
Student stu = new Student(1L, "小明", true);
Map<String, Object> bean2map = bean2map(stu);
System.out.println("bean2map:" + bean2map);
Map<String, Object> map = new HashMap();
map.put("id", 2L);
map.put("name", "小红");
map.put("admin", false);
Student map2bean = map2bean(map, Student.class);
System.out.println("map2bean:" + map2bean);
}
private static Map<String, Object> bean2map(Object obj) throws Exception {
Class clazz = obj.getClass();
Map<String, Object> map = new HashMap<>();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);//设置上限为Object,否则有Object的方法
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
map.put(pd.getName(), pd.getReadMethod().invoke(obj));
}
return map;
}
public static <T> T map2bean(Map<String, Object> map, Class clazz) throws Exception {
T obj = (T) clazz.newInstance();
BeanInfo beanInfo = Introspector.getBeanInfo(clazz, Object.class);
PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String key = pd.getName();
pd.getWriteMethod().invoke(obj, map.get(key));
}
return obj;
}
}
2.3测试结果: