[反射]比较两个VO对象的值

Posted 弃天笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[反射]比较两个VO对象的值相关的知识,希望对你有一定的参考价值。

 开发flash remoting的时候,直接把一个flash的vo对象发送到服务器,然后服务器接受这个vo,并取出对应的值,具体的情况可能各不相同,直接假设一个客户端传过来的vo要把里面有值的地方传给新的vo对象中
(实际例子,客户端传一个与Hibernate的VO具有相同属性的vo,在这里要把客户端vo的值传给hibernate的vo,从而更新数据库,为了避免给不同的vo手工编写代码,所以就用到了反射)
在这里,主要是利用到反射,这是一个简单的例子,有兴趣的人可以继续扩充
下面是比较类的代码
复制内容到剪贴板
代码:

  1. package org.sujun.utils;
  2. import java.lang.reflect.Method;
  3. /**
  4. * 比较对象算法
  5. * @author 弃天笑
  6. */
  7. public class ObjectCompare
  8. {
  9.     /**
  10.      * 比较客户端和服务端的vo,把clientVo有值的方法传给serverVo对应的方法
  11.      * @param clientVo
  12.      * @param serverVo
  13.      */
  14.     public static void voCompare(Object clientVo, Object serverVo) throws Exception
  15.     {
  16.         //通过反射得出客户端vo的所有get的属性方法
  17.         Class clientClass = clientVo.getClass();
  18.         Method[] methods = clientClass.getMethods();
  19.         for(int i = 0; i < methods.length; i++)
  20.         {
  21.             //System.out.println(methods.getName());
  22.             String methodName = methods.getName();
  23.             //查找出set相关的方法
  24.             int isGet = methodName.indexOf("get");
  25.             if(isGet != -1 && !methodName.equals("getClass"))
  26.             {
  27.                 Object result = null;
  28.                 //反射出该方法,并得到它的返回结果
  29.                 try
  30.                 {
  31.                     result = methods.invoke(clientVo,null);
  32.                 }
  33.                 catch(Exception e)
  34.                 {
  35.                     e.printStackTrace();
  36.                 }
  37.                 //System.out.println("===result===:" + result);
  38.                 if(result != null)
  39.                 {
  40.                     //有值,则传给serverVo对应的set方法
  41.                     methodName = methodName.substring(3,methodName.length());
  42.                     //System.out.println("==result.getClass()===" + result.getClass());
  43.                     try
  44.                     {
  45.                         Method method = null;
  46.                         if(result.getClass() == Integer.class)
  47.                         {
  48.                             method = serverVo.getClass().getMethod("set" + methodName,int.class);
  49.                         }
  50.                         else if(result.getClass() == Double.class)
  51.                         {
  52.                             method = serverVo.getClass().getMethod("set" + methodName,double.class);
  53.                         }
  54.                         else if(result.getClass() == Boolean.class)
  55.                         {
  56.                             method = serverVo.getClass().getMethod("set" + methodName,boolean.class);
  57.                         }
  58.                         else
  59.                         {
  60.                             method = serverVo.getClass().getMethod("set" + methodName, result.getClass());
  61.                         }
  62.                         //System.out.println("==method===" + method);
  63.                         method.invoke(serverVo,result);
  64.                         //System.out.println("=newResult====" + newResult);
  65.                     }
  66.                     catch(Exception e)
  67.                     {
  68.                         e.printStackTrace();
  69.                     }
  70.                 }
  71.             }
  72.         }
  73.     }
  74. //        private static Object reflectMethod(Object vo, Method method,String methodName, Object args)
  75. //        {
  76. //                System.out.println("=vo====" + vo);
  77. //                System.out.println("=method====" + method);
  78. //                System.out.println("=args====" + args);
  79. //                //Object[] objs = new Object[1];
  80. //                //objs[0] = "soda1111";
  81. //                try
  82. //                {
  83. //                        Object result = method.invoke(vo,null);
  84. //                        return result;
  85. //                }
  86. //                catch(Exception e)
  87. //                {
  88. //                        e.printStackTrace();
  89. //                }
  90. //                return null;
  91. //        }
  92. }
  93. 接着看一下需要比较的vo
  94. 复制内容到剪贴板
  95. 代码:
  96. public class ClientVo
  97. {
  98.     private String name;
  99.     private int age;
  100.     private String form;
  101.     private boolean flag;
  102.    
  103.     public String getName()
  104.     {
  105.         return name;
  106.     }
  107.     public void setName(String name)
  108.     {
  109.         this.name = name;
  110.     }
  111.     public int getAge()
  112.     {
  113.         return age;
  114.     }
  115.     public void setAge(int age)
  116.     {
  117.         this.age = age;
  118.     }
  119.     public String getForm()
  120.     {
  121.         return form;
  122.     }
  123.     public void setForm(String form)
  124.     {
  125.         this.form = form;
  126.     }
  127.    
  128.     public String toString()
  129.     {
  130.         return "[ClientVo name:" + name + " age:" + age + " form:" + form + "]";
  131.     }
  132.     public boolean getFlag() {
  133.         return flag;
  134.     }
  135.     public void setFlag(boolean flag) {
  136.         this.flag = flag;
  137.     }
  138. }
最后是测试代码

  1. import org.sujun.utils.ObjectCompare;
  2. public class TestMain
  3. {
  4.     public static void main(String[] args) throws Exception
  5.     {
  6.         ClientVo clientVo = new ClientVo();
  7.         clientVo.setName("soda");
  8.         clientVo.setAge(24);
  9.         clientVo.setFlag(true);
  10.         //clientVo.setForm("guang dong");
  11.         ClientVo serverVo = new ClientVo();
  12.         serverVo.setForm("by soda.C");
  13.         ObjectCompare.voCompare(clientVo, serverVo);
  14.         System.out.println(serverVo);
  15.     }
  16. }

编译输出结果是:
[ClientVo name:soda age:24 form:by soda.C]

//clientVo.setForm("guang dong");恢复这个注释的代码,输出的结果是:
[ClientVo name:soda age:24 form:guang dong]

可以当有属性没有值的时候,他是不会重新赋值的

事实上,对bean的各种操还可以使用 apache 的 BeanUtils ,功能很强大

以上是关于[反射]比较两个VO对象的值的主要内容,如果未能解决你的问题,请参考以下文章

C#利用反射实现两个类的对象之间相同属性的值的复制

反射比较两个对象属性名相同值不同

关于延迟加载(lazy)和强制加载(Hibernate.initialize(Object proxy) )

Java面试题:如何通过反射获取和设置对象私有字段的值?

C#用反射实现两个类的对象之间相同属性的值的复制

java使用反射比较两个bean对象属性值是否相等