javaBean含有列舉型別的屬性的自動封裝改進
阿新 • • 發佈:2018-12-22
javaBean中含有列舉型別屬性的自動封裝
近日做專案的時候,依舊被超長表單困擾,所以學習了一下自動封裝
寫了一個PropertyDescriptor
類實現的自動封裝方法,然而對於屬性中有列舉型別的
很是難受,因為從request
中獲取的Map集合是Map <String, String[]>
的
開始想的是過載一個set方法,然而PropertyDescriptor的getWriteMethod方法
只能獲取引數型別與屬性的型別相同的方法,所以我寫的過載方法獲取不到。。。
於是自己動手寫了一個
這個是通過servlet的request中獲取的Map來實現物件自動封裝
將javaBean類的引數型別為列舉型別的set方法刪掉,然後寫一個引數型別為String的方法
public void setB_sex(String b_sex) {
this.b_sex = Sex.valueOf(b_sex);
}
然後是自動封裝方法的實現
@SuppressWarnings("rawtypes")
public static Object getBean(HttpServletRequest request, Class type) {
try {
Map<String, String[]> map = request.getParameterMap();
BeanInfo beanInfo = Introspector.getBeanInfo(type);
Object obj = type.newInstance();
PropertyDescriptor[] propretyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor descriptor : propretyDescriptors) {
String propertyName = descriptor.getName();
if (map.containsKey(propertyName)) {
String[] value = map.get(propertyName);
Object[] args = new Object[1];
args[0 ] = value[0];
// System.out.println(propertyName);
// try {
// System.out.println(descriptor.getWriteMethod().getName());
// } catch (NullPointerException e) {
// System.out.println(propertyName + "的WriteMethod未找到");
// }
Method m = descriptor.getWriteMethod();
if (m != null) {
m.invoke(obj, args);
} else {
String setMethodName = "set" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
@SuppressWarnings("unchecked")
Method setMethod = type.getMethod(setMethodName, String.class);
setMethod.invoke(obj, args);
}
}
}
return obj;
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
System.out.println("未找到方法引數為String的方法");
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
}
return null;
}