当ADto中有次位为大写字母的字段,写一个共通方法,参数为List<ADto>、ADto.class、filePath,将List<ADto>出力到csv文件中,且次位为大写字母的字段只出力一次
时间: 2023-12-14 15:37:51 浏览: 145
可以使用反射来实现这个功能,具体步骤如下:
1. 首先定义一个方法,接收三个参数:List<ADto>、Class<ADto>和文件路径filePath。
2. 使用Class对象获取ADto类中所有的字段,可以使用getDeclaredFields()方法获取所有声明的字段。
3. 遍历字段数组,找到次位为大写字母的字段,并且记录下来。
4. 遍历ADto列表,将每个ADto对象转换成一个字符串数组,其中每个元素对应一个字段值。
5. 如果当前字段是次位为大写字母的字段,则将其值设置为一个特定的值(例如“***”),并且记录该字段已经输出过。
6. 将字符串数组输出到CSV文件中。
下面是一个示例代码实现:
```java
public static void writeDtoListToCsv(List<ADto> dtoList, Class<ADto> clazz, String filePath) {
try (CSVWriter writer = new CSVWriter(new FileWriter(filePath))) {
// 获取所有字段
Field[] fields = clazz.getDeclaredFields();
List<Integer> capitalIndexes = new ArrayList<>(); // 记录次位为大写字母的字段的索引
for (int i = 0; i < fields.length; i++) {
if (Character.isUpperCase(fields[i].getName().charAt(1))) {
capitalIndexes.add(i);
}
}
// 输出表头
String[] header = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
header[i] = fields[i].getName();
}
writer.writeNext(header);
// 输出数据
Set<Integer> outputIndexes = new HashSet<>(); // 记录已经输出过的字段的索引
for (ADto dto : dtoList) {
String[] row = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
field.setAccessible(true);
Object value = field.get(dto);
if (capitalIndexes.contains(i) && !outputIndexes.contains(i)) {
row[i] = "***";
outputIndexes.add(i);
} else {
row[i] = (value == null ? "" : value.toString());
}
}
writer.writeNext(row);
}
} catch (Exception e) {
e.printStackTrace();
}
}
```
在这个实现中,我们使用了CSVWriter类来将数据输出到CSV文件中,CSVWriter类是opencsv库中的一个工具类,可以方便地将字符串数组输出为CSV格式。需要注意的是,在输出数据时,我们使用了一个Set来记录已经输出过的字段的索引,以避免重复输出次位为大写字母的字段。
阅读全文