欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

反射克隆对象,将Map转化成JavaBean

程序员文章站 2022-03-31 16:53:17
...

反射初应用

利用反射克隆一个对象

 public static <T> T clone(Object obj,Class<T> t){
        T newObj = null;
        try {
            //基于传递的Class对象实例化一个空对象(数据为空)
            newObj = t.newInstance();
            //获取Class中的所有属性
            Field[] fields = t.getDeclaredFields();
            for (Field f : fields) {
                //获取属性名
                String fname = f.getName();
                //获取属性类型
                Class<?> ftype = f.getType();

                //获取属性对应的setter/getter方法名称
                String setMethodName = "set"+fname.substring(0,1).toUpperCase()+fname.substring(1);
                String getMethodName = "get"+fname.substring(0,1).toUpperCase()+fname.substring(1);
                //对于布尔类型的get方法,前缀以is开头
                if(Objects.equals("boolean",ftype.getName())){
                    getMethodName = "is"+fname.substring(0,1).toUpperCase()+fname.substring(1);
                }

                //根据提供的方法名称和类型获取方法对象
                Method methodSet = t.getMethod(setMethodName,ftype);
                Method methodGet = t.getMethod(getMethodName);

                //执行参数对象的get方法取出属性值,作为目标对象的set方法参数值
                Object returnVal = methodGet.invoke(obj);
                methodSet.invoke(newObj,returnVal);
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        return newObj;
    }
 public static <T> T clone1(T obj) throws Exception {
        Class<T> clazz = (Class<T>) obj.getClass();

        T o = null;
        o = clazz.newInstance();

        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            String name = field.getName();
            Class<?> type = field.getType();

            String suffix = name.substring(0,1).toUpperCase()+name.substring(1);
            String getName = "get"+suffix;
            String setName = "set"+suffix;

            Method methodGet = clazz.getMethod(getName);
            Method methodSet = clazz.getMethod(setName, type);

            methodSet.invoke(o,methodGet.invoke(obj));
        }

        return o;
    }

利用反射将map转化成javabean

 public static <T> T mapToBean1(Map<String,? super Object> map,Class<T> t)throws Exception{
        T instance = t.newInstance();

        for (Map.Entry<String, ? super Object> entry : map.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            Field field = t.getDeclaredField(key);

            field.setAccessible(true);

            field.set(instance,value);

        }
        return instance;
    }
public static <T> T mapToBean(Map<String,Object> map, Class<T> t){
        T target = null;
        try {
            //1. 实例化一个空对象
            target = t.newInstance();
            //2.获取Class中的所有属性名称
            Field[] fields = t.getDeclaredFields();
            for (Field f : fields) {
                //获取属性名称(map集合的键)
                String fieldName = f.getName();
                //设置属性的可访问性为true(暴力反射)
                f.setAccessible(true);
                //设置属性的值  sname=XXX
                f.set(target,map.get(fieldName));
            }
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        //返回目标对象
        return target;
    }