我想动态创建一个类文件.在这里......使用给定的ResultSet,使用getter和setter方法为ResultSet中存在的所有列动态提取我想要构建类文件的元数据.此外,我应该能够在以后的使用中使用我想要的类文件.任何机构都可以建议我更好地实现这一点.此外,如果任何现有的jar文件可用于实现此功能,那将会很有帮助.
也许Apache Beanutils可能适合您的要求?
请参阅Dynabeans部分
特别是:
3.3 ResultSetDynaClass(在DynaBeans中包装ResultSet)
DynaBean API的一个非常常见的用例是包装其他通常不作为JavaBeans出现的"东西"集合.最好的包装之一是当您要求JDBC驱动程序执行SQL SELECT语句时返回的java.sql.ResultSet.Commons BeanUtils提供了一种标准机制,使结果集的每一行都可以作为DynaBean显示,您可以使用它,如下例所示:
Connection conn = ...; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery ("select account_id, name from customers"); Iterator rows = (new ResultSetDynaClass(rs)).iterator(); while (rows.hasNext()) { DynaBean row = (DynaBean) rows.next(); System.out.println("Account number is " + row.get("account_id") + " and name is " + row.get("name")); } rs.close(); stmt.close();
3.4 RowSetDynaClass(断开连接的ResultSet为DynaBeans)
虽然ResultSetDynaClass是一种非常有用的技术,可以将SQL查询的结果表示为一系列DynaBeans,但一个重要的问题是底层ResultSet必须在应用程序处理行的整个时间段内保持打开状态.这阻碍了使用ResultSetDynaClass作为在模型 - 视图 - 控制器体系结构(例如Struts框架提供的体系结构)中从模型层向视图层传递信息的方法的能力,因为没有简单的机制来确保结果集最终关闭(如果您使用的是连接,则底层Connection返回其连接池).
RowSetDynaClass类表示解决此问题的不同方法.构造此类实例时,底层数据将复制到一组表示结果的内存中DynaBeans中.当然,这种技术的优点是,您可以立即关闭ResultSet(和相应的Statement),通常在您处理返回的实际数据之前.当然,缺点是您必须支付复制结果数据的性能和内存成本,结果数据必须完全适合可用的堆内存.对于许多环境(特别是在Web应用程序中),这种权衡通常非常有益.
作为额外的好处,RowSetDynaClass类被定义为实现java.io.Serializable,因此它(以及对应于结果的每一行的DynaBeans)可以方便地序列化和反序列化(只要基础列值也是序列化).因此,RowSetDynaClass表示将SQL查询的结果传输到基于Java的远程客户端应用程序(例如applet)的非常方便的方法.
事情是 - 从你的情况的声音,我明白你想在运行时创建这个类,基于你刚刚从数据库查询返回的ResultSet的内容.这一切都很好,可以用字节码操作完成.
但是,您认为您将从中获得什么好处?您的其他代码将无法调用此类上的任何方法(因为它们在编译时不存在),因此实际使用此生成的类的唯一方法是通过反射或通过其父类的方法或实现接口(我将假设它将扩展ResultSet).您可以在没有字节码编织的情况下执行后者(查看接口的任意运行时实现的动态代理),如果您正在执行前者,我不会看到如何使用类并getFoo
通过反射机械调用方法比只是打电话resultSet.getString("foo")
- 它会更慢,更笨重,更少类型安全.
那么 - 你确定你真的想创建一个课程来实现你的目标吗?