[反射]比较两个VO对象的值
作者:弃天笑 日期:2008-10-15
开发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]
可以当有属性没有值的时候,他是不会重新赋值的
(实际例子,客户端传一个与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]
可以当有属性没有值的时候,他是不会重新赋值的
评论: 0 | 引用: 0 | 查看次数: 4167
发表评论
订阅
上一篇
下一篇
文章来自:
Tags: 




