首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

当需要把一个对象的值赋给另一个对象中对应的属性时…解决思路

2012-01-23 
当需要把一个对象的值赋给另一个对象中对应的属性时……当需要把一个对象的值赋给另一个对象中对应的属性时,

当需要把一个对象的值赋给另一个对象中对应的属性时……
当需要把一个对象的值赋给另一个对象中对应的属性时,写一大堆的get()和set()是很麻烦的事情,而且代码看起来会很丑。在项目中屡次接触过一个方法(函数),这个方法(函数)可以把一个对象中的值全部赋给另一个对象中对应的同名的属性,不同名的就无视了,很是方便。下面直接上代码看看其原理大概是个什么样子:

 

首先有两个对象,一个Form和一个DTO

Java code
public class CarForm {    public String brand;    public String type;    public int price;    public int count;}


Java code
public class CarDto {    public String brand;    public String type;    public int price;    public int count;    public String encribe;}



然后写一个service类,用来模拟实现把表单提交的字符串转换成Form类的值
Java code
import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;/** * 模拟提交表单 * @author ... * */public class CarService {    public CarForm submitForm(Object form, String values) {        //以&分隔开来        String[] keyValues = values.split("&");        Map<String, Object> valueMap = new HashMap<String, Object>();        for (String s : keyValues) {            valueMap.put(s.substring(0, s.indexOf("=")), s.substring(s.indexOf("=") + 1));        }        Field[] fds = form.getClass().getDeclaredFields();        String typeClass;        Object value;        for (Field fd : fds) {            try {                typeClass = fd.getType().getSimpleName();                value = valueMap.get(fd.getName());                //需要判断属性类型,                if (typeClass.equals("int")) {                    value = Integer.parseInt(value.toString());                }                if (typeClass.equals("String")) {                    value = value.toString();                }                fd.set(form, value);            } catch (Exception e) {                e.printStackTrace();            }        }        return (CarForm) form;    }}



然后就是Copy两个对象的属性值了
Java code
import java.lang.reflect.Field;import java.util.HashMap;import java.util.Map;/** * 两个对象同名属性复制值 * @author chenglixiang * */public class Copys {    public static void copy(CarForm src, CarDto dest) {        Map<String, Object> srcMap = new HashMap<String, Object>();        Field[] srcFields = src.getClass().getDeclaredFields();        for (Field fd : srcFields) {            try {                srcMap.put(fd.getName(), fd.get(src)); //获取属性值            } catch (Exception e) {                e.printStackTrace();            }        }        Field[] destFields = dest.getClass().getDeclaredFields();        for (Field fd : destFields) {            if (srcMap.get(fd.getName()) == null) {                continue;            }            try {                fd.set(dest, srcMap.get(fd.getName())); //给属性赋值            } catch (Exception e) {                e.printStackTrace();            }        }    }}



最后做个测试 
Java code
import java.lang.reflect.Field;public class Test {    public static void main(String[] args) {        //模拟提交表单的字符串        String values = "brand=奥迪&type=A6&price=60&count=1000";        CarService carService = new CarService();        CarForm carForm = new CarForm();        carForm = carService.submitForm(carForm, values);        CarDto carDto = new CarDto();        Copys.copy(carForm, carDto);        carDto.encribe = "详细说明详细说明";        Field[] fds = carDto.getClass().getDeclaredFields();        for (Field fd : fds) {            try {                System.out.println(fd.getName() + "=" + fd.get(carDto));            } catch (Exception e) {                e.printStackTrace();            }        }    }} 



[解决办法]
good job.
[解决办法]
这个是反射的一个应用,不错。
[解决办法]
apache beanUtils看这个。。

热点排行