避免实体类空指针异常,并赋初值 可扩展(二)

2014-11-24 08:29:14 · 作者: · 浏览: 1
t = bean.getClass().newInstance();
// 获取bean的类名
Class beanClass = bean.getClass();
// 获取该Bean对外公共setter方法
Method[] beanMethods = beanClass.getMethods();
for (int i = 0; i < beanMethods.length; i++) {
if (beanMethods[i].getName().startsWith(START_SET)) {
this.setList.add(beanMethods[i]);
} else if (beanMethods[i].getName().startsWith(START_GET)
|| beanMethods[i].getName().startsWith(START_IS)) {
this.getList.add(beanMethods[i]);
}
}
for (int i = 0; i < this.setList.size(); i++) {
Method setMethod = (Method) this.setList.get(i);
String getMethod = getter(setMethod.getName());
// 判断属性是否有get方法
if (hasMethod(getMethod)) {
Method m = (Method) getList.get(i);
Object o = m.invoke(bean);// 执行get方法返回一个Object
if (o == null) {
// set方法参数类型
Class[] typeSet = setMethod.getParameterTypes();
// javaBean的set方法只有一个参数,只需要取第一个
Object[] oarray = initValue(typeSet[0]);
setMethod.invoke(object, oarray);
} else {
Object[] oarray = new Object[1];
oarray[0] = o;
setMethod.invoke(object, oarray);
}
}
}
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return object;
}
/**
* 获取getter方法 一个属性get方法名
*/
private String getter(String setter) {
String getMethod = START_GET + setter.substring(START_THREE);
if (hasMethod(getMethod)) {
// 获得getter方法存在返回
return getMethod;
} else {
// 获得getter方法不在 参数可能是boolean类型
getMethod = START_IS + setter.substring(START_THREE);
if (hasMethod(getMethod)) {
return getMethod;
}
}
return getMethod;
}
/**
* <>判断get方法是否存在<>
*/
private boolean hasMethod(String MethodName) {
boolean flag = false;
String tempName = null;
Method tempMethod = null;
for (int k = 0; k < getList.size(); k++) {
tempMethod = (Method) getList.get(k);
tempName = tempMethod.getName();
if (MethodName.equals(tempName)) {
flag = true;
break;
}
}
return flag;
}
/**
* 对属性初始化主要方法
* 可根据具体需求变动,比如初始化某一类型属性
*
*/
private Object[] initValue(@SuppressWarnings("rawtypes") Class type) {
Object[] oarray = new Object[1];
// javaBean的setter方法只有一个参数,只需要一个一维Object数组
String typeStr = type.getName();
if (TYPE_String.equals(typeStr)) {
// String类型初始化
oarray[0] = INIT_STRING;
} else if (TYPE_int.equals(typeStr)) {
// int类型初始化
oarray[0] = new Integer(INIT_INT);
} else if (TYPE_double.equals(typeStr)) {
// double类型初始化
oarray[0] = new Double(INIT_DOUBLE);
} else if (TYPE_float.equals(typeStr)) {
// float类型初始化
oarray[0] = new Float(INIT_FLOAT);
} else if (String.valueOf(TYPE_char).equals(typeStr)) {
// char类型初始化
oarray[0] = new Character(INIT_CHAR);
} else if (TYPE_BigDecimal.equals(typeStr)) {
// BigDecima类型初始化
oarray[0] = INIT_BigDecimal;
} else if (TYPE_Integer.equals(typeStr)) {
// Integer类型初始化
oarray[0] = INIT_Integer;
} else if (TYPE_Double.equals(typeStr)) {
// Double类型初始化
oarray[0] = INIT_Double;
} e