从CSV结构动态创建Java类

从CSV结构动态创建Java类,java,class,csv,Java,Class,Csv,我有一个CSV文件,我提取。 以下是提取数据的示例: name;town;zipcode foo;bar;55555 test;there;6666 我想要的是动态创建与CSV结构匹配的对应类(这是包含字段的第一行) Java是否可以在运行时(例如:Person)动态创建该类,然后将其用作“普通”类(Person-Person=new-Person()) 问候。这样做是可能的。。。但我认为这不是一个好主意 基本上,您需要: 读取CSV文件的第一行,并使用它计算字段的名称;e、 g.“名称”、

我有一个CSV文件,我提取。 以下是提取数据的示例:

name;town;zipcode
foo;bar;55555
test;there;6666
我想要的是动态创建与CSV结构匹配的对应类(这是包含字段的第一行)

Java是否可以在运行时(例如:Person)动态创建该类,然后将其用作“普通”类(
Person-Person=new-Person()


问候。

这样做是可能的。。。但我认为这不是一个好主意

基本上,您需要:

  • 读取CSV文件的第一行,并使用它计算字段的名称;e、 g.“名称”、“城镇”、“zipcode”
  • 阅读文件的第二行,并尝试对字段的合理类型进行直觉;e、 字符串,字符串,整数
  • 使用字段声明、构造函数和/或每个字段的getter和setter为类生成源代码。该类还可以包含用于解析CSV文件的代码。(我会使用一些基于Java的模板引擎(如Velocity或FreeMarker)来生成代码,但可以通过字符串碰撞来实现。)
  • 调用Java编译器来编译源代码
  • 使用动态类加载来加载已编译的类
  • 使用反射创建类的实例和/或对其调用方法
那为什么我认为这是个坏主意呢?有几个原因

  • “直观”字段类型的步骤是启发式的,可能不可靠。例如,尽管我们直觉地认为
    “55555”
    是一个数字,但事实上它是一个符号,可以更好地表示为字符串。(例如,假设文件的第三行有英国邮政编码“CB2 1QG”,而不是美国邮政编码。)

  • 生成的类几乎必须以反射方式使用。Java是一种静态类型的编程语言,您不能编写静态类型的代码来使用在编译时API未知的类。这意味着。。。例如这是您问题中的示例代码

       Person person = new Person();
    
    在从CSV文件生成并编译类之前无法编译。(使用反射生成的类甚至会很棘手,除非要做完全通用的事情。)



归根结底,根据您对字段实际含义的理解,您最好还是手工编写CSV文件的类。如果您确实生成了类,那么可能需要将其作为开发时活动来执行,这样您就可以编写(或生成)可以针对该类进行静态编译的代码。

或者您有一个完整的字段列表,在这种情况下,您可以构建一个包含所有字段的Person类,并根据CSV确定可以填充哪些字段

如果你想让它更具动态性,要么使用哈希表,要么经历Stephen C.所描述的麻烦


但是除了方法之外,你还想做什么?

是的,我假设你可以使用反射,但是你为什么要做这样的事情呢?您试图解决的问题是什么?CSV字段可能会有所不同。。。我想探索这种编程技巧。首先没有什么理由这样做:对于运行时可能变化的数据,有一个编译时“定义”类有什么好处?处理这种情况的正确方法是通过哈希表。+1解释类必须被反射使用。