如何在Java程序中将列名转换为变量?

如何在Java程序中将列名转换为变量?,java,reflection,Java,Reflection,假设有数千行数据来自一个表 Index | First_name | Last_name ===================================================== 1 | John | Doe 2 | Jane | Doe 任务是在某个bean中表示该表的每一行。例如,如果有 private int inde

假设有数千行数据来自一个表

    Index      | First_name       |    Last_name 
=====================================================
    1          |  John            |     Doe
    2          |  Jane            |     Doe
任务是在某个bean中表示该表的每一行。例如,如果有

private int index;
private String firstName
private String lastName
不幸的是,列数和列名未知,无法在获取数据之前创建bean

因此,我无法硬编码变量名称,以期望使用
名字。我不知道需要多少变量以及这些变量的类型。

有没有一种方法可以将表中的行表示为bean的一部分,其中变量名与列名相同

这里的想法是,我最终将不得不比较这些bean的'n',并希望智能地报告差异

我想我可以

Set<String> columnNames
List<Object> columnData
设置列名称
列数据

然后按索引进行匹配,但有更干净的方法吗?

我认为表示数据的更好方法是为每行创建一个
映射,而不是必须首先创建一个自定义Bean类。。。如果不知道它有哪些属性(例如get/set对),那么以后就不能真正使用它


反射不能创建类(或接口),尽管您可以使用一些字节码操作库,或者生成Java源代码并将其传递给编译器。(但是,之后如何使用该类?仍然只是使用反射。)

我认为更好的表示数据的方法是为每行创建一个
映射,而不是必须首先创建一个自定义Bean类。。。如果不知道它有哪些属性(例如get/set对),那么以后就不能真正使用它


反射不能创建类(或接口),尽管您可以使用一些字节码操作库,或者生成Java源代码并将其传递给编译器。(但是,之后如何使用该类?仍然只是使用反射。)

理论上,您可以使用字节码操纵库(如BCEL:)动态创建类,然后将它们加载到JVM中


然而,这不太值得付出努力。也许您应该问问自己,为什么数据库列必须是Java类中的字段。你打算用它们做什么?

理论上,你可以使用字节码操纵库(如BCEL:)动态创建类,然后将它们加载到JVM中


然而,这不太值得付出努力。也许您应该问问自己,为什么数据库列必须是Java类中的字段。您打算用它们做什么?

如果您使用的是JDBC,您可以使用它来获取有关结果集中返回的列、它们的名称和类型的附加信息。

如果您使用的是JDBC,您可以使用它来获取有关结果集中返回的列的附加信息,它们的名称和类型。

这应该让您开始阅读列名和类型(假设连接是
java.sql.connection
):


这应该让您开始阅读列名和类型(假设连接是
java.sql.connection
):


您是通过JDBC获取数据的吗?更典型的是,在Java中,
First\u name
这样的列名被翻译成与
firstName
@mac的Java等价物:在您提到的一条评论中,您也不知道表名,但这并没有反映在您的问题中。你知道那张桌子的名字吗?@home。是的,表名是已知的。基本上,它将是一个包含一些任意数据的表。直到我们看到那里,我们才知道它是什么。我无法硬编码预期的列名、列数、存储在其中的数据类型etc@toto. 让我试着澄清一下。我需要一个JavaBean能够表示表中的一行数据,其中列的数量未知,列的名称未知。然后我需要能够引用从给定列检索的数据元素(最好是通过列的名称),您是否通过JDBC获取数据?更典型的是在Java中,像
First\u name
这样的列名被翻译成它们的Java等价物
firstName
@mac:在您提到的一条评论中,您也不知道表名,但这并没有反映在您的问题中。你知道那张桌子的名字吗?@home。是的,表名是已知的。基本上,它将是一个包含一些任意数据的表。直到我们看到那里,我们才知道它是什么。我无法硬编码预期的列名、列数、存储在其中的数据类型etc@toto. 让我试着澄清一下。我需要一个JavaBean能够表示表中的一行数据,其中列的数量未知,列的名称未知。然后,我需要能够引用从给定列检索的数据元素(最好是通过列的名称),这很好,但我不知道表的名称是什么。因此,我无法智能地命名变量。我不知道我需要几张这张桌子就可以了,但我不知道这张桌子的名字是什么。因此,我无法智能地命名变量。我不知道instanceCorrect需要多少。以及如何“创建一个与列名同名的变量”@mac--请看。。可以用正确的属性和值(有点像映射)实例化LazyDynaBean。以及如何“创建一个与列名同名的变量”@mac--请看。。您可以用属性和值(有点像映射)实例化LazyDynaBean。在上面的示例中,字符串/对象表示什么?字符串是列名,对象是值(例如,索引列的
整数
,其他列的字符串)。在上面的示例中,字符串/对象代表什么?字符串是列名,对象是值(例如,索引列为
整数,索引列为字符串)
    DatabaseMetaData metadata = connection.getMetaData();
    ResultSet rsColumns = metadata.getColumns(null, null, "tablename", null);
    while (rsColumns.next()) 
    {
      String columnName = rsColumns.getString("COLUMN_NAME");
      String columnType = rsColumns.getString("TYPE_NAME");

      // Do your magic

    }