Java反射将一个对象所有字段的值赋给另一个相似的对象
2016-10-17 14:52:11  By: dwtedx

在工作中需要接受来自前置的消息、然后将其消息转化为我们自己格式的对象、然后经由后台处理、最后再转化为前置格式的对象并返回给他们、由于对象之间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);
    }

}


doField方法

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;
}


若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


猜你喜欢的

快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+