你的位置:首页 > Java教程

[Java教程]反射将一个对象所有字段的值赋给另一个相似的对象


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