返回信息流最近在做一个项目,查数据库某个表的时候,事先并不知道这个表有些什么列,所以:1.需要先查一下它有哪些列。2.创建一个类,以这些列作为属性生成一个class,再构造一个这个class的实例,再用它作为返回类型,去查这个表的数据。
ps:访问数据库用的Spring JdbcTemplate
有没有大神知道啊?
这是一条镜像帖。来源:北邮人论坛 / java / #53376同步于 2016/10/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
怎样在运行时定义一个类,并生成它的实例
wislov
2016/10/1镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这样貌似也行,就是想知道能不能用动态生成class的方式来做
【 在 kayla 的大作中提到: 】
: 呃……放在一个 map 里?
: 不是,这就算能实现,接口不好定义吧?
用ASM试试?http://asm.ow2.org/
要知道,你要做的事,其实是做一个类似编译器的东西,生成Java Bytecode,装载进当前的JVM。这件事一点也不容易。请三思。
不过,Terra语言(http://terralang.org/)的作者2年前曾经用Terra语言实现了你想做的这件事:读取数据库表中的列,然后运行时生成类、域,以及访问方法,性能还特别好(论文:http://terralang.org/pldi083-devito.pdf)。他的作品在编程语言领域的顶级会议PLDI上发表了。Terra本身就是为元编程而设计的,具有JIT编译功能(利用LLVM),并能将一个个的语句“拼接”成函数,然后拼接成模块,在运行时编译。Java并不是为这个设计的。如果要用ASM的话,这个Bytecode生成的过程要你自己来做。
一个研究项目:mint,是Java上的multi-stage programming框架,不过似乎只有论文。http://www.cs.rice.edu/~mgricken/research/mint/index.shtml
这么麻烦啊,我还以为cglib之类的就能做。asm是不是比较底层?感觉这个需求应该也会有一些场景会用到吧
【 在 nuanyangyang 的大作中提到: 】
: 用ASM试试?http://asm.ow2.org/
: 要知道,你要做的事,其实是做一个类似编译器的东西,生成Java Bytecode,装载进当前的JVM。这件事一点也不容易。请三思。
: 不过,Terra语言(http://terralang.org/)的作者2年前曾经用Terra语言实现了你想做的这件事:读取数据库表中的列,然后运行时生成类、域,以及访问方法,性能还特别好(论文:http://terralang.org/pldi083-devito.pdf)。他的作品在编程语言领域的顶级会议PLDI上发表了。Terra本身就是为元编程而设计的,具有JIT编译功能(利用LLVM),并能将一个个的语句“拼接”成函数,然后拼接成模块,在运行时编译。Java并不是为这个设计的。如果要用ASM的话,这个Bytecode生成的过程要你自己来做。
: ...................
也许吧。不过,用Object[]数组行不行呢?顶多int型的域存成Integer而已。
毕竟,你JIT定义的类,只有你JIT编译出来的方法可以访问。
【 在 wislov 的大作中提到: 】
: 这么麻烦啊,我还以为cglib之类的就能做。asm是不是比较底层?感觉这个需求应该也会有一些场景会用到吧
嗯!这个时候就感觉java的基本类型不是类是有点不方便
【 在 nuanyangyang 的大作中提到: 】
: 也许吧。不过,用Object[]数组行不行呢?顶多int型的域存成Integer而已。
: 毕竟,你JIT定义的类,只有你JIT编译出来的方法可以访问。
:
【 在 wislov 的大作中提到: 】
: 嗯!这个时候就感觉java的基本类型不是类是有点不方便
这种动态的应用场景,免不了装箱一次。就算Scala不分基本类型和对象类型,要弄一个Array[Any],也免不了装箱的。