爱程序网

反射将一个对象所有字段的值赋给另一个相似的对象

来源: 阅读:

在工作中需要接受来自前置的消息,然后将其消息转化为我们自己格式的对象,然后经由后台处理,最后再转化为前置格式的对象并返回给他们,由于对象之间set、get感觉代码太冗余,所以想写个工具类来作为后续发展,晚上查了很多资料,发现只有单个对象的转化,对象中又有其他对象的话,这种转化方式没看到,研究了两天,终于将最终完善版本写出来了,不过还是有很多缺陷的,判断是否是基本数据类型那个方法感觉还是不够完善,想Array[String]之类的这些还是不能够完全匹配,所以这个方法也只能用于简单的对象之间的转化,不过还是先贴出来,等下次有空的时候在进行优化,或者博友有啥好的建议尽情发表啊。

public class TestFinal {

    public static void main(String[] args) throws InstantiationException, InvocationTargetException {
        MtUserInfoRule mt = new MtUserInfoRule();
        mt.setName("1");
        mt.setPassport("1");
        mt.setAddress("1");
        mt.setCredentials("2");
        mt.setEmail("2");
        mt.setHkmlp("2");
        mt.setId("2");
        mt.setMobile("1");
        mt.setMtp("1");
        mt.setTlp("1");
        mt.setPinyin("1");
        
        Person p = new Person();
        p.setId_p(1);
        p.setName_p("personName");
        p.setMen_p(true);
        p.setCh_p('a');
        p.setFloat_p(1f);
        p.setDouble_p(2.0);
        p.setLong_p(2l);
        p.setShort_p((short) 3);
        p.setByte_p((byte) 4);

        Student s = new Student();
        s.setId_s(11);
        s.setName_s("stuName");

        p.setStudent_p(s);
        mt.setPerson(p);

        UserInfoRule info = new UserInfoRule();
        doField(mt, info);
    }

    private static void doField(Object obj, Object obj2) throws InstantiationException, InvocationTargetException {
        try {
            Field[] properties = obj.getClass().getDeclaredFields();
            Field[] field2 = obj2.getClass().getDeclaredFields();
            for (Field p : properties) {

                boolean accessible = p.isAccessible();
                p.setAccessible(true);
                String fieldName1 = p.getName();
                // boolean类型的isMen的get方法名就是isMen
                String strGet = p.getType().equals(Boolean.class) || p.getType().equals(boolean.class) ? fieldName1
                        : ("get" + fieldName1.substring(0, 1).toUpperCase()
                                + fieldName1.substring(1, fieldName1.length()));
                Method methodGet = obj.getClass().getDeclaredMethod(strGet);
                Object object = methodGet.invoke(obj);
                for (Field p2 : field2) {
                    p2.setAccessible(true);
                    //两个对象名字相同(如果两个对象名字有差异,则可以转换进行匹配)
                    if (p.getName().equals(p2.getName())) {
                        if (returnBoolean(p)) {
                            doField(object, p2.getType().newInstance());
                        } else {
                            if (boolean.class.equals(p2.getType()) || Boolean.class.equals(p2.getType())) {
                                p2.set(obj2, "1".equals(object) ? true : false);
                            } else {
                                p2.set(obj2, object);
                            }
                            System.out.println(p2.getName() + ":" + p2.get(obj2));
                        }
                    }
                    p.setAccessible(accessible);
                }
            }
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }

    }

    
    //判断是否是基本数据类型或者是String、Date(可能不全面,可能还有其他类型)
    public static boolean returnBoolean(Field f) {
        Class t = f.getType();
        if (String.class.equals(t) || Date.class.equals(t) || byte.class.equals(t) || Byte.class.equals(t)
                || short.class.equals(t) || Short.class.equals(t) || float.class.equals(t) || Float.class.equals(t)
                || long.class.equals(t) || Long.class.equals(t) || int.class.equals(t) || Integer.class.equals(t)
                || double.class.equals(t) || Double.class.equals(t) || boolean.class.equals(t)
                || Boolean.class.equals(t) || char.class.equals(t) || Character.class.equals(t)) {
            return false;
        }
        return true;
    }
}

 

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助