运用反射机制实现form之间属性的拷贝
,也就说这个bean的所有属性必须是String类型,而且不能使String[],虽然功能有限,但是这个思想我觉得很好,大家不妨在我的基础上写出比apache更好的copyProperties()方法。我好长时间没有来了,最近一直加班,所以写完这个帖子可能不能有多少时间维护,希望大家原谅
package com.xjw.utils;
import java.lang.reflect.*;
import java.util.*;
/**
本类就是用于formBean之间属性的对拷,主要的方法是copyFormBeanPropertys
*/
public class BeanUtil {
/**
得到fields的容器
@param Class objClass 当前对象的Class对象
@return ArrayList承装对象属性的容器
*/
public static ArrayList getFildsArray(Class objClass) {
ArrayList al = null;
try {
//得到所有的属性
Field[] fields = objClass.getDeclaredFields();
al = new ArrayList();
for (int i = 0; i < fields.length; i++) {
al.add(fields[i].getName());
}
} catch (Exception e) {
al = null;
System.out.println(e);
}
return al;
}
/**
得到bean属性与方法的映射关系
@param Class objClass 当前对象的Class对象
@return HashMap承装属性与方法的映射关系的容器
*/
public static HashMap getMethodsMap(Class objClass) {
HashMap hm = null;
try {
//得到此对象所有的方法
Method[] methods = objClass.getDeclaredMethods();
hm = new HashMap(); //承装属性与方法的映射关系的容器
String fieldName = ""; //属性名称首字母为大写
String methodName = ""; //方法名称
ArrayList al = getFildsArray(objClass); //得到本类的所有属性
boolean isEndWithGet = false; //是否是get开头的
boolean isFind = false; //判断方法名称是否包含此属性名称
boolean isEndWithSet = false; //是否是set开头的
if (al != null) { //属性不能不存在
int alSize = al.size(); //多少个属性
for (int i = 0; i < alSize; i++) {
//得到首字母为大写的属性名称
fieldName = upFirstChar((String) al.get(i));
//对应属性名称的get和set方法
Method[] myMothodArrag = new Method[2];
//遍历所有方法找到和属性名称相同的set和get方法
for (int j = 0; j < methods.length; j++) {
methodName = (methods[j].getName());
isEndWithGet = methodName.startsWith("get");
isFind = methodName.endsWith(fieldName);
isEndWithSet = methodName.startsWith("set");
if (isFind & isEndWithGet) {
myMothodArrag[0] = methods[j]; //如果是get方法,则放到自定义容器的第一位
} else if (isFind & isEndWithSet) {
myMothodArrag[1] = methods[j]; //如果是set方法,则放到自定义容器的第2位
}
}
//遍历后只有属性,缺少方法的情况,不放到影射容器里
if (myMothodArrag[0] != null & myMothodArrag[0] != null) {
hm.put(fieldName, myMothodArrag);
}
}
}
} catch (Exception e) {
System.out.prin
补充:软件开发 , Java ,