当前位置: 代码迷 >> Java相关 >> 反照将一个对象所有字段的值赋给另一个相似的对象
  详细解决方案

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

热度:103   发布时间:2016-04-22 19:08:35.0
反射将一个对象所有字段的值赋给另一个相似的对象

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

 

2楼码魂
相似?这tmd是相似么......
Re: 唔贝
@码魂,可能每个人对相似的理解不太一样吧= =。这只是我个人的理解
1楼vinsen
前两天也写了一个,但是效率慢的想死,20个字段,100条数据, 花了1分钟,而对象直接赋值只要几秒.....,PS:对象直接赋值可以用Excel公式拼好语句.....
Re: 唔贝
@vinsen,为啥我40多个字段,300条数据,才1秒多= =。
  相关解决方案