1. 程式人生 > >javaBean含有列舉型別的屬性的自動封裝改進

javaBean含有列舉型別的屬性的自動封裝改進

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; }