java的简单反射运用实例(读取csv文件映射为对象)

来源:互联网 发布:java 数据一致性 编辑:程序博客网 时间:2024/05/20 07:14
<span style="font-family: Arial, Helvetica, sans-serif;">private Map<String, ArrayList<? extends Object>> loadCSVObject(</span>
            String objectName, String csvFileNodeName) throws Exception {            String fieldArray[] = null;            Map<String, ArrayList<? extends Object>> map = new HashMap<String, ArrayList<? extends Object>>();            InputStream inputStream = new FileInputStream(new File(DATA_FILE_PREFIX                + File.separator + csvFileNodeName));            BufferedReader br = new BufferedReader(new InputStreamReader(                inputStream));            if (br.ready()) {                String line = null;                for (int i = 0; i < 3; i++) {                    if (i == 2) {                        line = br.readLine().substring(1);                        fieldArray = line.split(",");                    } else if (i < 2 || i < 3) {                        br.readLine();                    }                }            }            while (br.ready()) {                String line = br.readLine();                String valueArray[] = line.split(",");                Object o = Class.forName(objectName).newInstance();                for (int i = 1; i < valueArray.length; i++) {                    String value = valueArray[i].replace("&cm;", ",");                    this.setFieldValue(o, StringUtils.trim(fieldArray[i - 1]), value);                }                ArrayList<Object> list = (ArrayList<Object>)map.get(valueArray[0]);                if (list == null) {                    list = new ArrayList<Object>();                    map.put(valueArray[0], list);                }                list.add(o);            }            br.close();            return map;        }<span style="white-space:pre"></span>// 对象映射        private void setFieldValue(Object obj, String fname, String value) {            if (value == null || value.equals("") ) {                return;            }            Class<?> clazz = obj.getClass();            try {                String methodname = "set" + Character.toUpperCase(fname.charAt(0))                    + fname.substring(1);                Method[] methods = clazz.getMethods();                Method method = null;                for (Method m : methods) {                    if (m.getName().equals(methodname)) {                        method = m;                        break;                    }                }                if (method == null) {                    method = clazz.getDeclaredMethod(methodname);                    if (!Modifier.isPublic(method.getModifiers())) {                        method.setAccessible(true);                    }                    method.invoke(obj);                } else {                    Class<?>[] types = method.getParameterTypes();                    if (types[0].equals(BigDecimal.class)) {                        method.invoke(obj, new BigDecimal(value));                    } else {                        method.invoke(obj, value);                    }                }            } catch (Exception e) {                try {                    Field field = clazz.getDeclaredField(fname);                    if (!Modifier.isPublic(field.getModifiers())) {                        field.setAccessible(true);                    }                    if (field.getType().equals(BigDecimal.class)) {                        field.set(obj, new BigDecimal(value));                    } else {                        field.set(obj, value);                    }                } catch (Exception fe) {                    return;                }            }        }

题外话:以前用Hibernate做项目是出现过,根据xml文件映射不到对象,是因为对象没有空的构造函数,所以在运用框架的时候,很多框架都是利用反射原理来实现的,所以在写类的时候一定要注意留下一个空构造函数

0 0