模拟Java内省的功能

来源:互联网 发布:淘宝卖家手机号采集器 编辑:程序博客网 时间:2024/05/21 23:31

★ 前提:

定义一个Model类,里面所有的属性都是private的,然后为每个属性提供getter和setter方法;
再准备一个Map,map的key值都是类里面的属性字段的字符串表示,值任意。

★ 实际:

设计一个方法Object getModel(Map map,Class cls),传入一个包含所有值的Map,然后再传入Model类的class,那么返回Model类的实例,这个实例里面已经包含好了所有相关的数据。也就是把Map中的数据通过反射,设置回到Model类实例中。

package cn.hucu.reflect.beanUtils;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Map;public class MyBeanUtils {public static <T> T populate(Class<T> c, Map<String, Object> map) //泛型throws Exception {T obj = c.newInstance();// 获取c中的所有属性fldsField flds[] = c.getDeclaredFields();// 针对每一个fld,如果map中有该属性,就生成对应的setter方法,并且把c中把该Method对象找出来,进行调用以设置数据。否则就跳过for (Field fld : flds) {// 到map中查找,看是否有该属性的数据Object value = map.get(fld.getName());if (value == null) {System.out.println(fld.getName() + "属性的数据在Map中没有,跳过赋值...");} else {// 生成对应的setter方法,并且把c中把该Method对象找出来,进行调用以设置数据String methodName = "set"+ fld.getName().substring(0, 1).toUpperCase() //例如:setName首字母大写+ fld.getName().substring(1);Method m = c.getDeclaredMethod(methodName, fld.getType());m.invoke(obj, value);}}return obj;}}
小小工具能量大!!!

原创粉丝点击