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