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

<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文件映射不到对象,是因为对象没有空的构造函数,所以在运用框架的时候,很多框架都是利用反射原理来实现的,所以在写类的时候一定要注意留下一个空构造函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值