如何用注释解决反射不保证字段的顺序
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何用注释解决反射不保证字段的顺序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何用注释解决反射不保证字段的顺序"吧!Talk is
千家信息网最后更新 2026年11月02日如何用注释解决反射不保证字段的顺序
本篇内容主要讲解"如何用注释解决反射不保证字段的顺序",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何用注释解决反射不保证字段的顺序"吧!
Talk is cheap, show me the code.直接上码!
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)public @interface MyColumn { int columnIndex() default 0;}public class PoiUtil { /** * 获取文件内容列表 * * @param file * @param clazz * @param * @return * @throws Exception */ public List getListFromFile(MultipartFile file, Class clazz) throws Exception { //最终返回数据 List resultList = new ArrayList(); InputStream is = file.getInputStream(); //使用工厂方法创建. Workbook wb = WorkbookFactory.create(is); Sheet sheet = wb.getSheetAt(0); int totalRowNum = sheet.getLastRowNum(); //获得总列数 int cellLength = sheet.getRow(0).getPhysicalNumberOfCells(); //获取反射类的所有字段 Field[] fields = clazz.getDeclaredFields(); //创建一个字段数组,用于和excel行顺序一致. Field[] newFields = new Field[cellLength]; for (int i = 0; i < cellLength; i++) { for (Field field : fields) { Annotation[] annotationArr = field.getDeclaredAnnotations(); for (Annotation annotation : annotationArr) { if (annotation instanceof MyColumn) { if (i == ((MyColumn) annotation).columnIndex()) { newFields[i] = field; } } } } } //从第x行开始获取 for (int x = 1; x <= totalRowNum; x++) { T object = clazz.newInstance(); //获得第i行对象 Row row = sheet.getRow(x); //如果一行里的所有单元格都为空则不放进list里面 int rowNum = 0; for (int y = 0; y < cellLength; y++) { if (!(row == null)) { Cell cell = row.getCell(y); if (cell == null) { rowNum++; } else { Field field = newFields[y]; String value = getCellVal(cell); if (value != null && !value.equals("")) { //给字段设置值. setValue(field, value, object); } } } } if (rowNum != cellLength && row != null) { resultList.add(object); } } return resultList; } /** * 导出文件 * * @param list * @param clazz * @param * @throws InvocationTargetException * @throws IllegalAccessException * @throws NoSuchMethodException */ public void exportFile(List list, Class clazz) throws Exception { //1.创建一个工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); //2.创建一个工作表sheet HSSFSheet sheet = workbook.createSheet("test"); //List userList = userService.selectAll(); //构造参数依次表示起始行,截至行,起始列, 截至列 CellRangeAddress region = new CellRangeAddress(0, 0, 0, 3); sheet.addMergedRegion(region); HSSFCellStyle style = workbook.createCellStyle(); //水平居中 style.setAlignment(HorizontalAlignment.CENTER); //垂直居中 style.setVerticalAlignment(VerticalAlignment.CENTER); HSSFRow row1 = sheet.createRow(0); HSSFCell cell = row1.createCell(0); //设置值,这里合并单元格后相当于标题 cell.setCellValue("人员信息表"); //将样式添加生效 cell.setCellStyle(style); // 获取反射类的所有字段 Field[] fields = clazz.getDeclaredFields(); for (int i = 0; i < list.size(); i++) { //行 HSSFRow row = sheet.createRow(i + 1); //对列赋值 int colIndex2 = 0; for (Field field : fields) { String fieldName = field.getName(); Annotation[] annotationArr = field.getDeclaredAnnotations(); for (Annotation annotation : annotationArr) { if (annotation instanceof MyColumn) { if (((MyColumn) annotation).columnIndex() == colIndex2) { String value = clazz.getMethod("get" + getFirstCapitalStr(fieldName)).invoke(list.get(i)).toString(); row.createCell(0).setCellValue(value); } colIndex2++; } } } } } /** * 判断字符串首字母是否为大写,如果不是转化为大写 * * @param str * @return */ public static String getFirstCapitalStr(String str) { if (str.charAt(0) >= 'A' && str.charAt(0) <= 'Z') { return str; } char[] ch = str.toCharArray(); ch[0] -= 32; return String.valueOf(ch); } /** * 给字段赋值,判断值的类型,然后转化成实体需要的类型值. * * @param field 字段 * @param value 值 * @param object 对象 */ private static void setValue(Field field, String value, Object object) { try { field.setAccessible(true); DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (field.getGenericType().toString().contains("Integer")) { field.set(object, Integer.valueOf(value)); } else if (field.getGenericType().toString().contains("String")) { field.set(object, value); } else if (field.getGenericType().toString().contains("Date")) { field.set(object, fmt.parse(value)); } field.setAccessible(false); } catch (Exception e) { e.printStackTrace(); } } /** * 获取单元格中的值 * * @param cell * @return String */ private static String getCellVal(Cell cell) { // DecimalFormat df = new DecimalFormat("0.0000"); DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String val = ""; switch (cell.getCellTypeEnum()) { case STRING: val = cell.getRichStringCellValue().getString(); break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { //日期型 val = fmt.format(cell.getDateCellValue()); } else { // 数字格式 todo val = String.valueOf(cell.getNumericCellValue()); } break; case BOOLEAN: val = String.valueOf(cell.getBooleanCellValue()); break; case FORMULA: val = cell.getCellFormula(); break; case BLANK: break; default: val = ""; } return val; }} 到此,相信大家对"如何用注释解决反射不保证字段的顺序"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
字段
反射
顺序
注释
保证
内容
单元
对象
文件
方法
类型
学习
工作
起始
实用
更深
一致
一行
人员
信息
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
保险科技 互联网保险
互联网金融监管科技数据
互联网科技会
互联网 科技创业
伴你行互联网科技有限公司
互联网科技有限公司 翻译
承德科技产业互联网发展
互联网公司科技股
世界互联网科技公司市值排名
互联网科技与大数据专业
内蒙古九一互联网科技
朱啸虎曾投资哪些互联网科技企业
南通创西澳互联网科技有限公司
上海创道互联网络科技有限公司
互联网科技企业商标注意事项
互联网科技机房
好易买互联网科技
安徽零酒互联网科技有限公司
现代科技的标志之一的互联网
如何强化互联网金融科技
互联网科技企业
互联网佳科技有限公司
鸠鸠互联网科技
互联网科技会
融贸通互联网科技
现代科技和互联网有关系吗
欧洲十大科技互联网公司
互联网公司科技股
互联网高科技行业有哪些企业
亚光科技低轨卫星互联网