动态生成类并加载到内存

yunzhongyu 2011-02-21 10:35:56
动态生成类 让后根据类的内容生成数据库(hibernate)。
怎样做
...全文
263 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
hp0632 2011-06-07
  • 打赏
  • 举报
回复
#16楼 得分:0回复于:2011-02-22 19:06:13已生成hibernate(class)实体bean了。现在怎样不在重启tomact情况下,把class加载到jvm并生成相应的表(目前只有重启tomact才回重新生成表)。

我也是遇到了同样的问题,如果有答案,发我,谢谢 hp0632
pauliuyou 2011-02-28
  • 打赏
  • 举报
回复
动态编译吧 导入tools.jar, 然后再Class.forName().
yunzhongyu 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 humanity 的回复:]

引用楼主 yunzhongyu 的回复:
动态生成类 让后根据类的内容生成数据库(hibernate)。
怎样做


以前 Codehaus.org 上有一个开源项目,名字忘记了,被 Drools 2.1 - 2.5 使用了它其中一个包,这个包里面就有一个类能给一个 String 它去编译到当前你指定的类加载器中,不产生临时磁盘文件,我们直接用这个类加载器.loadClass 就能得到……
[/Quote]

我下载后里面没有你说的jar包啊
yunzhongyu 2011-02-22
  • 打赏
  • 举报
回复
已生成hibernate(class)实体bean了。现在怎样不在重启tomact情况下,把class加载到jvm并生成相应的表(目前只有重启tomact才回重新生成表)。
消息都是 2011-02-21
  • 打赏
  • 举报
回复
想怎么做就
树成 2011-02-21
  • 打赏
  • 举报
回复
是这样,例如,我是说例如,表结构肯定不是这样。

你建立三个表,一个表(sys_table)里面存放表,一个表(sys_columns)里面存放列,另一个表(sys_rows)里面存放数据。

当你在业务上,也就是页面上操作生成一张表的时候,你就往那个sys_table表里面插入一条数据,建立列的时候你往(sys_columns)里面存放数据,如果是今后有这些业务数据增删改,你可以对sys_rows进行维护。
这样,你实际的数据库表结构就稳定了下来,不用执行表生成语句,那么hibernate的modle也稳定了下来,那么在业务上的建表与建列其实都是insert或者update。数据库中不存在物理表。
yunzhongyu 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 spiniper 的回复:]

那就设计一个表结构,虚拟一套表,列,行 的关系,实现业务上存在建表,数据库中物理上,表,列,数据 都是数据。
[/Quote]

不是太明白,这不还得生成类 让后加载这个类?
树成 2011-02-21
  • 打赏
  • 举报
回复
那就设计一个表结构,虚拟一套表,列,行 的关系,实现业务上存在建表,数据库中物理上,表,列,数据 都是数据。
yunzhongyu 2011-02-21
  • 打赏
  • 举报
回复
因为工程都是hibernate+Spring,如果只用sql建表,没有hibernate实体bean,没办法查询、添加等。
树成 2011-02-21
  • 打赏
  • 举报
回复
但是过于频繁的建表语句其实是不好的。
你可以设计一个表结构,虚拟出表、行、列的关系映射,然后对其进行维护,从业务上看是生成了这些表,但是从数据库上,并不存在这些物理表。
树成 2011-02-21
  • 打赏
  • 举报
回复
你这没有必要生成类吧,用单纯的sql语句就能完成。
yunzhongyu 2011-02-21
  • 打赏
  • 举报
回复
数据库方面先暂不考虑,常用的几种就行,
我的业务是这样的,请教各位还有别的思路没?
前端拖拽生成业务数据表单,根据表单能容生成相应的业务数据表。
有啥好的思路和办法?
树成 2011-02-21
  • 打赏
  • 举报
回复
有个变通的做法,你可以自己实现一个类装载器来装载你生成的类。你可以读入或者在程序里面生产java源文件,用System.exec方法调用javac命令进行编译成class,然后用类装载器装载此class。不过实现一样很麻烦
想喝咖啡的貓 2011-02-21
  • 打赏
  • 举报
回复
这个 还是很有难度的,先不说别的,数值型在不同的数据库中定义都不完全相同,市场上大小小的几十种数据库得多少个实现啊,hibernate也没全实现。
yunzhongyu 2011-02-21
  • 打赏
  • 举报
回复
有啥好的办法吗?
树成 2011-02-21
  • 打赏
  • 举报
回复
研究一下class文件的结构就好。
hibernate也不是自己实现这个功能的,它使用的好像是CGLIB
虽然我不想打击你,但是你不太可能实现这个功能的。
humanity 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 yunzhongyu 的回复:]
动态生成类 让后根据类的内容生成数据库(hibernate)。
怎样做
[/Quote]

以前 Codehaus.org 上有一个开源项目,名字忘记了,被 Drools 2.1 - 2.5 使用了它其中一个包,这个包里面就有一个类能给一个 String 它去编译到当前你指定的类加载器中,不产生临时磁盘文件,我们直接用这个类加载器.loadClass 就能得到编译生成的结果,这个参数字符串就是 java 源文件内容。

不过我忘记了这个开源 API 的名字。或许打开 drools 2.x 的下载后的第三方 jar 列表能找到其中一个 j..no.jar 的文件。



焙焙龙 2011-02-21
  • 打赏
  • 举报
回复
动态生成类加载到内存是可行的,不过代价么,呵呵

1,让程序在运行过程中拼凑源码字符串(可以使用文件模版),然后调用Tools.jar包里有个编译的工具类,javac也会调用这个类的,所以,没必要再绕个弯子调用javac.exe程序,不利于移植。编译完成后在进行加载
2,还有一种就是直接在内存中构造.class类型信息,这个比较高深,你可以尝试使用CGLIB,当然,它也依赖于ASM,也就是JAVA的汇编。

性能上自然是有一定的消耗的。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧