当ADto中有次位为大写字母的字段,写一个共通方法,参数为List<ADto>、ADto.class、filePath,将List<ADto>出力到csv文件中,且次位为大写字母的字段只出力一次
时间: 2023-12-14 17:36:07 浏览: 66
可以使用反射来实现这个功能。具体步骤如下:
1. 定义一个静态方法,接收三个参数:List<ADto>、Class<T>、String,其中 T 为 ADto 的类型参数。
```java
public static <T extends ADto> void writeToCSV(List<T> list, Class<T> clazz, String filePath) {
// TODO: 实现写入CSV文件的逻辑
}
```
2. 获取所有字段,判断是否为次位大写字母的字段,如果是则只输出一次。
```java
Field[] fields = clazz.getDeclaredFields();
Set<String> set = new HashSet<>();
for (Field field : fields) {
if (Character.isUpperCase(field.getName().charAt(1))) {
set.add(field.getName());
}
}
```
3. 使用 CSVWriter 将数据写入 CSV 文件中。可以使用 opencsv 库来实现。
```java
CSVWriter writer = new CSVWriter(new FileWriter(filePath));
String[] headers = Arrays.stream(fields)
.map(Field::getName)
.toArray(String[]::new);
writer.writeNext(headers);
for (T t : list) {
String[] record = Arrays.stream(fields)
.map(field -> {
try {
field.setAccessible(true);
Object value = field.get(t);
return value == null ? "" : value.toString();
} catch (IllegalAccessException e) {
e.printStackTrace();
return "";
}
})
.toArray(String[]::new);
writer.writeNext(record);
}
writer.close();
```
4. 完整代码如下:
```java
public static <T extends ADto> void writeToCSV(List<T> list, Class<T> clazz, String filePath) throws IOException {
Field[] fields = clazz.getDeclaredFields();
Set<String> set = new HashSet<>();
for (Field field : fields) {
if (Character.isUpperCase(field.getName().charAt(1))) {
set.add(field.getName());
}
}
CSVWriter writer = new CSVWriter(new FileWriter(filePath));
String[] headers = Arrays.stream(fields)
.map(Field::getName)
.toArray(String[]::new);
writer.writeNext(headers);
for (T t : list) {
String[] record = Arrays.stream(fields)
.map(field -> {
try {
field.setAccessible(true);
Object value = field.get(t);
return value == null ? "" : value.toString();
} catch (IllegalAccessException e) {
e.printStackTrace();
return "";
}
})
.toArray(String[]::new);
writer.writeNext(record);
}
writer.close();
}
```
阅读全文