[反射]比较两个VO对象的值
Posted 弃天笑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[反射]比较两个VO对象的值相关的知识,希望对你有一定的参考价值。
开发flash remoting的时候,直接把一个flash的vo对象发送到服务器,然后服务器接受这个vo,并取出对应的值,具体的情况可能各不相同,直接假设一个客户端传过来的vo要把里面有值的地方传给新的vo对象中
(实际例子,客户端传一个与Hibernate的VO具有相同属性的vo,在这里要把客户端vo的值传给hibernate的vo,从而更新数据库,为了避免给不同的vo手工编写代码,所以就用到了反射)
在这里,主要是利用到反射,这是一个简单的例子,有兴趣的人可以继续扩充
下面是比较类的代码
编译输出结果是:
[ClientVo name:soda age:24 form:by soda.C]
//clientVo.setForm("guang dong");恢复这个注释的代码,输出的结果是:
[ClientVo name:soda age:24 form:guang dong]
可以当有属性没有值的时候,他是不会重新赋值的
事实上,对bean的各种操还可以使用 apache 的 BeanUtils ,功能很强大
(实际例子,客户端传一个与Hibernate的VO具有相同属性的vo,在这里要把客户端vo的值传给hibernate的vo,从而更新数据库,为了避免给不同的vo手工编写代码,所以就用到了反射)
在这里,主要是利用到反射,这是一个简单的例子,有兴趣的人可以继续扩充
下面是比较类的代码
复制内容到剪贴板
最后是测试代码
代码:
- package org.sujun.utils;
- import java.lang.reflect.Method;
- /**
- * 比较对象算法
- * @author 弃天笑
- */
- public class ObjectCompare
- {
- /**
- * 比较客户端和服务端的vo,把clientVo有值的方法传给serverVo对应的方法
- * @param clientVo
- * @param serverVo
- */
- public static void voCompare(Object clientVo, Object serverVo) throws Exception
- {
- //通过反射得出客户端vo的所有get的属性方法
- Class clientClass = clientVo.getClass();
- Method[] methods = clientClass.getMethods();
- for(int i = 0; i < methods.length; i++)
- {
- //System.out.println(methods.getName());
- String methodName = methods.getName();
- //查找出set相关的方法
- int isGet = methodName.indexOf("get");
- if(isGet != -1 && !methodName.equals("getClass"))
- {
- Object result = null;
- //反射出该方法,并得到它的返回结果
- try
- {
- result = methods.invoke(clientVo,null);
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- //System.out.println("===result===:" + result);
- if(result != null)
- {
- //有值,则传给serverVo对应的set方法
- methodName = methodName.substring(3,methodName.length());
- //System.out.println("==result.getClass()===" + result.getClass());
- try
- {
- Method method = null;
- if(result.getClass() == Integer.class)
- {
- method = serverVo.getClass().getMethod("set" + methodName,int.class);
- }
- else if(result.getClass() == Double.class)
- {
- method = serverVo.getClass().getMethod("set" + methodName,double.class);
- }
- else if(result.getClass() == Boolean.class)
- {
- method = serverVo.getClass().getMethod("set" + methodName,boolean.class);
- }
- else
- {
- method = serverVo.getClass().getMethod("set" + methodName, result.getClass());
- }
- //System.out.println("==method===" + method);
- method.invoke(serverVo,result);
- //System.out.println("=newResult====" + newResult);
- }
- catch(Exception e)
- {
- e.printStackTrace();
- }
- }
- }
- }
- }
- // private static Object reflectMethod(Object vo, Method method,String methodName, Object args)
- // {
- // System.out.println("=vo====" + vo);
- // System.out.println("=method====" + method);
- // System.out.println("=args====" + args);
- // //Object[] objs = new Object[1];
- // //objs[0] = "soda1111";
- // try
- // {
- // Object result = method.invoke(vo,null);
- // return result;
- // }
- // catch(Exception e)
- // {
- // e.printStackTrace();
- // }
- // return null;
- // }
- }
- 接着看一下需要比较的vo
- 复制内容到剪贴板
- 代码:
- public class ClientVo
- {
- private String name;
- private int age;
- private String form;
- private boolean flag;
- public String getName()
- {
- return name;
- }
- public void setName(String name)
- {
- this.name = name;
- }
- public int getAge()
- {
- return age;
- }
- public void setAge(int age)
- {
- this.age = age;
- }
- public String getForm()
- {
- return form;
- }
- public void setForm(String form)
- {
- this.form = form;
- }
- public String toString()
- {
- return "[ClientVo name:" + name + " age:" + age + " form:" + form + "]";
- }
- public boolean getFlag() {
- return flag;
- }
- public void setFlag(boolean flag) {
- this.flag = flag;
- }
- }
- import org.sujun.utils.ObjectCompare;
- public class TestMain
- {
- public static void main(String[] args) throws Exception
- {
- ClientVo clientVo = new ClientVo();
- clientVo.setName("soda");
- clientVo.setAge(24);
- clientVo.setFlag(true);
- //clientVo.setForm("guang dong");
- ClientVo serverVo = new ClientVo();
- serverVo.setForm("by soda.C");
- ObjectCompare.voCompare(clientVo, serverVo);
- System.out.println(serverVo);
- }
- }
[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对象的值的主要内容,如果未能解决你的问题,请参考以下文章