业务需要,要把一个对象中的值封装到另一个对象中。所以自己写了一个转换工具,而没使用BeanUtils.copyProperties()。
以后可以参考类似思路进行Vo、Bo、Po等封装类的转换。
代码例子如下,仅列出大概思路:
public class VoConvertUtil {
/**
* 将指定Vo中的属性值转移到另一个Vo中,只有相同名称的属性才能转移
*
* @param desObj
* 目标Vo对象,可以是一个new出的实例
* @param srcObj
* 源Vo对象
* @return 转移后的新Vo对象
* @throws 自行封装的Exception
*/
public static Object convertVoToVo(Object desObj, Object srcObj)
throws 自行封装的Exception {
BeanInfo bi = null;
Method method = null;
try {
bi = Introspector.getBeanInfo(desObj.getClass());
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
String methodName = "get"
+ pd.getName().substring(0, 1).toUpperCase()
+ pd.getName().substring(1);
try {
method = srcObj.getClass().getDeclaredMethod(methodName);
} catch (NoSuchMethodException e) {
continue;
}
Object srcValue = method.invoke(srcObj);
if (null != srcValue && null != pd.getWriteMethod()
&& !"getClass".equals(methodName)) {
pd.getWriteMethod().invoke(desObj, srcValue);
} else {
continue;
}
}
} catch (IntrospectionException e) {
throw new 自行封装的Exception(e);
} catch (SecurityException e) {
throw new 自行封装的Exception(e);
} catch (IllegalArgumentException e) {
throw new 自行封装的Exception(e);
} catch (IllegalAccessException e) {
throw new 自行封装的Exception(e);
} catch (InvocationTargetException e) {
throw new 自行封装的Exception(e);
}
return desObj;
}
public static Object formatVoPropertyToBlank(Object vo)
throws 自行封装的Exception {
BeanInfo bi = null;
try {
bi = Introspector.getBeanInfo(vo.getClass());
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
Object propertyValue = pd.getReadMethod().invoke(vo);
if (null == propertyValue) {
if ("class java.lang.String".equals(pd.getPropertyType()
.toString())) {
pd.getWriteMethod().invoke(vo, "");
} else if ("class java.math.BigDecimal".equals(pd.getPropertyType()
.toString())) {
pd.getWriteMethod().invoke(vo, new BigDecimal(0));
}
} else {
continue;
}
}
} catch (IntrospectionException e) {
throw new 自行封装的Exception(e);
} catch (IllegalArgumentException e) {
throw new 自行封装的Exception(e);
} catch (IllegalAccessException e) {
throw new 自行封装的Exception(e);
} catch (InvocationTargetException e) {
throw new 自行封装的Exception(e);
}
return vo;
}
}
分享到:
相关推荐
- `copy(Object obj)`: 复制对象。 - `clone()`: 克隆对象。 - `toString()`: 将对象转换为字符串。 - `notify()`: 唤醒一个等待的线程。 - `notifyAll()`: 唤醒所有等待的线程。 - `wait(int timeout)`: 使...
Sub过程用于执行一系列操作,而Function过程则可以返回一个值。在处理销售记录时,我们可能需要定义一个Sub过程来打开或关闭工作簿,或者定义一个Function过程来计算特定的销售指标,如总销售额或平均销售额。 在...
在OOP中,**类**是创建对象的蓝图或模板,而**对象**则是类的一个实例。 #### 二、类的定义方法 1. **定义类**:类是用户自定义的数据类型,它由一系列数据成员(成员变量)和成员函数组成。 ```cpp class ...
Java波浪文字制作方法及源代码 1个目标文件 摘要:Java源码,初学实例,波浪文字 Java波浪文字,一个利用Java处理字符的实例,可以设置运动方向参数,显示文本的字符数组,高速文本颜色,显示字体的 FontMetrics对象,...
赋值运算符 (=) 将一个值赋给变量。 atan 方法 返回一个数的反正切。 atan2 方法 返回从 X 轴到点 (y, x)的角度(以弧度为单位)。 atEnd 方法 返回一个指示枚举算子是否处于集合结束处的 Boolean 值。 big ...
11. **原型模式**:用原型实例指定创建对象的种类,并且通过复制这些原型创建新的对象。在需要大量创建相似对象的场景下,原型模式可以提高效率。 12. **组合模式**:将对象组合成树形结构以表示“部分-整体”的...
- **适用性**:一个对象结构包含很多类对象,它们有不同的接口,而想对这些对象实施一些依赖于其具体类的操作。 以上是对Java设计模式的基本介绍和说明,每种模式都有其独特的应用场景和优势,在实际开发中合理...
Creator也可以定义一个工厂方法的缺省实现,它返回一个缺省的ConcreteProduct对象。 - **ConcreteCreator**:重定义工厂方法以返回一个ConcreteProduct实例。 - **示例**: ```java public interface Work { ...
赋值运算符 (=) 将一个值赋给变量。 atan 方法 返回一个数的反正切。 atan2 方法 返回从 X 轴到点 (y, x)的角度(以弧度为单位)。 atEnd 方法 返回一个指示枚举算子是否处于集合结束处的 Boolean 值。 big ...
赋值运算符 (=) 将一个值赋给变量。 atan 方法 返回一个数的反正切。 atan2 方法 返回从 X 轴到点 (y, x)的角度(以弧度为单位)。 atEnd 方法 返回一个指示枚举算子是否处于集合结束处的 Boolean 值。 big ...
- 工厂模式:定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 - 原型模式:通过复制已有对象来创建新对象。 2. 结构型模式: - 适配器模式:使两个不兼容的接口能够协同...
SessionBean: Stateless Session Bean 的生命周期是由容器决定的,当客户机发出请求要建立一个Bean的实例时,EJB容器不一定要创建一个新的Bean的实例供客户机调用,而是随便找一个现有的实例提供给客户机。...
- **静态成员变量**:一个静态成员变量可以用来存储定义的多项式的数量,以便统计实例化了多少个多项式对象。 - **成员函数**:包括输入、输出、计算值等函数。输入函数负责从用户那里获取指数和系数,输出函数...
参与者:Product(定义工厂方法所创建的对象的接口)、ConcreteProduct(实现Product接口的具体类)、Creator(声明工厂方法,返回一个...对象)、ConcreteCreator(重定义工厂方法以返回一个ConcreteProduct实例)...
赋值运算符重载`operator=`确保了当一个`Array`对象被赋值给另一个时,正确地复制数据。数组下标运算符重载`operator[]`使得我们可以像操作普通数组一样访问`Array`对象的元素。 这两个例子展示了模板在C++中的基本...
value:一个Unicode 字符。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为ROT13Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个...
代码可能包含一个名为Singleton的类,其中静态成员函数`getInstance()`返回唯一的类实例。 2. **工厂方法模式 (Factory Method)**:定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟...
- **C++实现要点**:使用深拷贝或浅拷贝技术来复制对象,通常需要重载赋值运算符或提供一个克隆方法。 #### 三、结构型模式 结构型模式关注的是如何组合类或对象以获得更大的结构。 - **2.1 Bridge模式** - **...