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

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

package org.sujun.utils;

import java.lang.reflect.Method;

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[i].getName());
            String methodName = methods[i].getName();
            //查找出set相关的方法
            int isGet = methodName.indexOf("get");
            if(isGet != -1 && !methodName.equals("getClass"))
            {
                Object result = null;
                //反射出该方法,并得到它的返回结果
                try
                {
                    result = methods[i].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]

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


文章来自: 本站原创
引用通告地址: http://www.sujun.org/trackback.asp?tbID=38
Tags:
评论: 0 | 引用: 0 | 查看次数: 4167
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码:
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 1000 字 | UBB代码 开启 | [img]标签 关闭
Google