要编写一个类型安全的函数,接受任意对象并生成一个CSV字符串,可以使用泛型和反射来实现。
下面是一个示例代码:
import java.lang.reflect.Field;
public class CsvGenerator {
public static String generateCsv(T object) {
StringBuilder csvBuilder = new StringBuilder();
// 获取对象的所有字段
Field[] fields = object.getClass().getDeclaredFields();
// 构建CSV标题行
for (Field field : fields) {
csvBuilder.append(field.getName()).append(",");
}
csvBuilder.deleteCharAt(csvBuilder.length() - 1); // 删除最后一个逗号
csvBuilder.append("\n");
// 构建CSV数据行
try {
for (Field field : fields) {
field.setAccessible(true);
Object value = field.get(object);
csvBuilder.append(value).append(",");
}
csvBuilder.deleteCharAt(csvBuilder.length() - 1); // 删除最后一个逗号
csvBuilder.append("\n");
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return csvBuilder.toString();
}
public static void main(String[] args) {
// 测试示例
Person person = new Person("John", 30, "john@example.com");
String csv = generateCsv(person);
System.out.println(csv);
}
}
class Person {
private String name;
private int age;
private String email;
public Person(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
// 省略getter和setter方法
}
在上面的示例中,我们定义了一个generateCsv
函数,它使用了泛型
来接受任意类型的对象。函数内部使用反射获取对象的所有字段,并将字段名作为CSV的标题行。然后,通过反射获取字段的值,并将其添加到CSV的数据行中。最后,将构建好的CSV字符串返回。
在main
方法中,我们创建了一个Person
对象,并将其传递给generateCsv
函数生成CSV字符串。然后,将CSV字符串打印输出。
运行以上代码,输出结果如下所示:
name,age,email
John,30,john@example.com
通过这种方式,我们可以编写一个通用的、类型安全的函数,接受任意对象并生成CSV字符串。