在使用用struts的actionForm时要把属性拷到BO对象时发现org.apache.commons.beanutils.PropertyUtilsBean的copyPropert有些问题:如不能把字符字符串转为Long类型(作为公共工具类本应是这样)为了适应开发需要我重写了copyPropert方法.下面贴出来
java 代码
- package com.zhgrd.basic.util;
-
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.InvocationTargetException;
- import java.lang.reflect.Method;
- import java.util.Iterator;
- import java.util.Map;
-
- import org.apache.commons.beanutils.BeanUtilsBean;
- import org.apache.commons.beanutils.ContextClassLoaderLocal;
- import org.apache.commons.beanutils.DynaBean;
- import org.apache.commons.beanutils.DynaProperty;
- import org.apache.commons.beanutils.PropertyUtils;
- import org.apache.commons.beanutils.PropertyUtilsBean;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
-
-
-
-
-
-
-
-
- public class ObjectPropertyUtilsBean extends PropertyUtilsBean{
- Log log = LogFactory.getLog(ObjectPropertyUtilsBean.class);
-
-
- private static final ContextClassLoaderLocal beansByClassLoader = new ContextClassLoaderLocal() {
-
- protected Object initialValue() {
- return new ObjectPropertyUtilsBean();
- }
- };
- public static ObjectPropertyUtilsBean getInstance(){
- return (ObjectPropertyUtilsBean)beansByClassLoader.get();
- }
- public void copyProperties(Object dest, Object orig)
- throws IllegalAccessException, InvocationTargetException,
- NoSuchMethodException {
-
- if (dest == null) {
- throw new IllegalArgumentException ("目标对象为空");
- }
- if (orig == null) {
- throw new IllegalArgumentException("没有拷贝对象");
- }
-
- if (orig instanceof DynaBean) {
- DynaProperty origDescriptors[] =
- ((DynaBean) orig).getDynaClass().getDynaProperties();
- for (int i = 0; i < origDescriptors.length; i++) {
- String name = origDescriptors[i].getName();
- if (dest instanceof DynaBean) {
- if (isWriteable(dest, name)) {
- Object value = ((DynaBean) orig).get(name);
- ((DynaBean) dest).set(name, value);
- }
- } else {
- if (isWriteable(dest, name)) {
- Object value = ((DynaBean) orig).get(name);
- setSimpleProperty(dest, name, value);
- }
- }
- }
- } else if (orig instanceof Map) {
- Iterator names = ((Map) orig).keySet().iterator();
- while (names.hasNext()) {
- String name = (String) names.next();
- if (dest instanceof DynaBean) {
- if (isWriteable(dest, name)) {
- Object value = ((Map) orig).get(name);
- ((DynaBean) dest).set(name, value);
- }
- } else {
- if (isWriteable(dest, name)) {
- Object value = ((Map) orig).get(name);
- setSimpleProperty(dest, name, value);
- }
- }
- }
- } else {
- PropertyDescriptor origDescriptors[] =
- getPropertyDescriptors(orig);
- for (int i = 0; i < origDescriptors.length; i++) {
- String name = origDescriptors[i].getName();
- if (isReadable(orig, name)) {
- if (dest instanceof DynaBean) {
- if (isWriteable(dest, name)) {
- Object value = getSimpleProperty(orig, name);
- ((DynaBean) dest).set(name, value);
- }
- } else {
- if (isWriteable(dest, name)) {
- Object value = getSimpleProperty(orig, name);
- setSimpleProperty(dest, name, value);
- }
- }
- }
- }
- }
-
- }
-
-
-
- public void setSimpleProperty(Object bean,String name, Object value)throws IllegalAccessException, InvocationTargetException,
- NoSuchMethodException {
-
- if (bean == null) {
- throw new IllegalArgumentException("对象为空");
- }
- if (name == null) {
- throw new IllegalArgumentException("属性名为空");
- }
-
-
- if (name.indexOf(PropertyUtils.NESTED_DELIM) >= 0) {
- throw new IllegalArgumentException ("属性名不规范");
- } else if (name.indexOf(PropertyUtils.INDEXED_DELIM) >= 0) {
- throw new IllegalArgumentException("属性名不规范");
- } else if (name.indexOf(PropertyUtils.MAPPED_DELIM) >= 0) {
- throw new IllegalArgumentException ("属性名不规范");
- }
-
-
- if (bean instanceof DynaBean) {
- DynaProperty descriptor =((DynaBean) bean).getDynaClass().getDynaProperty(name);
- if (descriptor == null) {
- return;
- }
- ((DynaBean) bean).set(name, value);
- return;
- }
-
-
- PropertyDescriptor descriptor = getPropertyDescriptor(bean, name);
- if (descriptor == null) {
- return;
- }
- Method writeMethod = getWriteMethod(descriptor);
- if (writeMethod == null) {
- throw new NoSuchMethodException("属性 '" + name + "' 没有Setter方法");
- }
- Class cl = getPropertyType(bean, name);
- if(value != null)
- if(!cl.getName().equals(value.getClass().getName())){
- if(cl.getName().equals(Long.class.getName())){
- if(value.getClass().getName().equals(String.class.getName()))
- value = Long.valueOf((String)value);
-
- }
- }
-
-
- Object values[] = new Object[1];
- values[0] = value;
- invokeMethod(writeMethod, bean, values);
-
- }
-
- private Object invokeMethod(
- Method method,
- Object bean,
- Object[] values)
- throws
- IllegalAccessException,
- InvocationTargetException {
- try {
-
- return method.invoke(bean, values);
-
- } catch (IllegalArgumentException e) {
-
- log.error("方法反射失败.", e);
- throw new IllegalArgumentException(
- "不能反射: " + method.getDeclaringClass().getName() + "."
- + method.getName() + " - " + e.getMessage());
-
- }
- }
-
-
- }
下面还要写一个类PropertyUtil爆露一个静态方法来使用copyPropert
java 代码
- package com.zhgrd.basic.util;
-
- import java.lang.reflect.InvocationTargetException;
- import org.apache.commons.beanutils.PropertyUtils;
-
-
- public class PropertyUtil extends PropertyUtils{
- public static void copyProperties(Object dest, Object orig) throws IllegalAccessException, InvocationTargetException,
- NoSuchMethodException {
- ObjectPropertyUtilsBean.getInstance().copyProperties(dest, orig);
- }
- }
好了现在可以使用了.
java 代码
- SysUserForm tform = (SysUserForm)form;
- try{
- PropertyUtil.copyProperties(tsysUser, tform);
- }catch(Exception ex){
- logger.debug("属性拷贝异常:");
- ex.printStackTrace();
- }
仅供学习.本人不保证上面代码正确.
分享到:
相关推荐
首先,Apache BeanUtils是Apache Commons项目的一部分,提供了一系列便捷的工具方法用于Bean的操作,包括属性的复制。它使用反射机制实现,通过getter和setter方法进行属性的读写。其优点在于简单易用,但缺点是在...
本知识点将围绕Apache Commons文档中的关键组件展开,涵盖Apache Commons Lang、Commons BeanUtils、Commons Collections等常用模块的核心功能。 ### Apache Commons Lang Apache Commons Lang库提供了大量用于处理...
- `commons-beanutils-1.7.0.jar`: 用于简化Bean操作,如属性复制等。 - `commons-chain-1.1.jar`: 提供了一种链式处理机制。 - `commons-digester-1.8.jar`: 用于解析XML配置文件。 - `commons-logging-1.0.4.jar`:...
`commons-lang-2.0.jar`、`commons-beanutils-1.6.1.jar`、`commons-digester-1.5.jar`和`commons-logging-1.1.1.jar`都是Apache Commons项目中的组件,它们提供了各种实用工具类,如字符串操作、Bean操作、XML解析...
- 例如,如果某个jar文件的MANIFEST.MF中指定了`Class-Path: commons-beanutils.jar`等,那么在加载该jar时,会先加载这些依赖的jar文件。 #### 五、总结 理解Tomcat启动时类加载的顺序对于排查类加载异常、避免类...
import org.apache.commons.beanutils.Converter; public class MyEnumConverter implements Converter { @Override // 将value 转换为 c 类型 --- 枚举通用转换器 public Object convert(Class c, Object value...
import org.apache.commons.beanutils.BeanUtils; // 复制属性 BeanUtils.copyProperties(targetBean, sourceBean); ``` 以上就是关于JavaWeb阶段的学习笔记,重点介绍了Servlet的基本概念和开发流程、...
2. commons-beanutils.jar 3. commons-collections.jar 4. commons-logging.jar 5. ezmorph.jar 6. json-lib-2.2.2-jdk15.jar 在Struts2的配置文件`struts.xml`中,需要进行如下修改: 1. 扩展名改为`json-default`...
- Apache Commons Digester和BeanUtils等Apache Commons组件简化了XML与Java对象的绑定。 总之,Java提供了多种处理XML的方法,从基本的DOM和SAX到高级的JAXB和XSLT,开发者可以根据具体需求选择合适的技术。理解...
**工具** 如Apache Commons BeanUtils库也可以用来在JavaBean和Map对象之间进行转换,虽然它不直接处理XML,但可以作为进一步转换的基础。此外,一些IDE如Eclipse和IntelliJ IDEA提供了内置的功能来自动生成JavaBean...
6. BeanUtils是Apache Commons BeanUtils库中的一个工具类,它提供了对JavaBean属性进行操作的方法,如copyBeans()用于属性复制。 7. StringBuffer是一个可变的字符序列,它提供了许多方法,如append()和insert(),...
- `Commons-beanutils`:简化JavaBean的操作。 - `Commons-io`:提供了一组强大的IO操作工具。 - `log4j`:日志记录框架,支持不同的日志级别和格式化输出。 5. **MyBatis**:一种优秀的持久层框架,学习其核心...
- commons-beanutils.jar:提供根据类路径创建对象的方法。 - commons-digester.jar:解析XML文件。 - commons-fileupload.jar:支持文件上传功能。 - commons-logging.jar:日志输出,如Log4j。 - commons-...
3. **BeanUtils**:通常指的是Apache Commons BeanUtils库,它是Apache Commons项目的一部分,提供了各种工具方法,帮助开发者更方便地操作JavaBeans。BeanUtils可以自动转换数据类型,复制属性,甚至根据setter和...
JSTL的函数库引入了来自Apache Commons Lang和Apache Commons BeanUtils库的许多有用函数,方便在JSP页面中进行字符串操作、日期处理等。 **5. XML库(XML)** XML库允许在JSP页面上处理XML文档,包括解析XML、创建...
此外,还可以使用其他拷贝方式,比如使用`copy-constructor`(构造函数的副本)或`BeanUtils.copyProperties()`(Apache Commons BeanUtils库提供),但这些方法也需根据具体情况判断是否能实现深拷贝。 总之,理解...
4. **使用工具类或库**:例如,Apache Commons Lang库提供了`BeanUtils.copyProperties()`方法,可以方便地将一个对象的所有属性复制到另一个对象。这种方法简单易用,但需要注意的是,如果源对象和目标对象有属性...
- 使用Apache Commons Lang库中的`BeanUtils.copyProperties`方法。 - 使用第三方库如Guava提供的拷贝工具。 #### 总结 在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象...
另一种方法是使用第三方库,如Apache Commons BeanUtils的`TableSorter`类。 ### TableSorter类 在提供的文件列表中,`TableSorter.java`很可能是一个实现了排序功能的类。`TableSorter`通常是一个模型类,它扩展了...