2012-01-05 85 views
0

我有一个CSV文件,我解压缩。 这里是提取数据的例子:从CSV结构动态创建Java类

name;town;zipcode 
foo;bar;55555 
test;there;6666 

我想要什么,是在飞行中(因为它包含的字段也就是第一行),将匹配的CSV结构创建对应的类。

是否有可能用Java在运行时创建该类(即时)并将其用作“普通”类(Person person = new Person())?

问候。

+4

是的我假设你可以使用反射,但为什么你想要做这样的事情?你试图解决什么问题? – gideon 2012-01-05 07:29:20

+0

CSV字段可以改变...我想探索这种编程技巧。 – Dieeego 2012-01-05 07:46:05

+2

首先没有什么理由:编译时“定义”类对于在运行时可能会有所不同的数据有什么好处?处理这种情况的正确方法是通过散列表。 – Viruzzo 2012-01-05 09:25:56

回答

2

有可能做到这一点......但我不认为这是一个好主意。

基本上,你将需要:

  • 阅读的CSV文件的第一行的用它来找出字段的名称;例如“名称”,“城镇”,“邮编”。
  • 阅读文件的第二行,尝试直观地理解字段的类型;例如字符串,字符串,整数。
  • 为字段生成源代码,并为每个字段声明一个构造函数和/或getter和setter。该类还可以包含解析CSV文件的代码。 (我会使用一些基于Java的模板引擎(如Velocity或FreeMarker)来生成代码,但可以通过字符串抨击来实现。)
  • 调用Java编译器来编译源代码。
  • 使用动态类加载来加载编译后的类。
  • 使用反射来创建类的实例和/或调用它们的方法。

那么,为什么我认为这是一个坏主意?几个原因...

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

  • 生成的类几乎反射性地使用。 Java是一种静态类型的编程语言,您不能编写静态类型的代码来使用API​​在编译时不为人知的类。这意味着......比如......在你的问题

    Person person = new Person(); 
    

    示例代码无法编译,直到后,你会生成并从CSV文件编译的类。 (它甚至会是棘手的使用使用反射生成的类,除了做完全通用的东西。)


底线是,你可能是最好关闭或者编写类CSV文件根据你对这些领域实际意义的理解。如果你确实生成了这个类,那么可能将它作为一个开发时间活动来完成,这样你就可以编写(或生成)可以对该类进行静态编译的代码。

+0

+1的解释,该类将不得不反思性地使用。 – Avi 2012-01-05 20:58:26

0

要么你有字段的完整列表,在这种情况下,你可以建立一个Person类的所有字段,以及哪些领域可填充的CSV确定...

如果你想让它更加动态,要么使用散列表或通过斯蒂芬C描述的麻烦...

但超越方法你想要做什么?