使用内省机制实现Map与Bean之间的转换

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测试结果:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值