BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #53376同步于 2016/10/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

怎样在运行时定义一个类,并生成它的实例

wislov
2016/10/1镜像同步13 回复
最近在做一个项目,查数据库某个表的时候,事先并不知道这个表有些什么列,所以:1.需要先查一下它有哪些列。2.创建一个类,以这些列作为属性生成一个class,再构造一个这个class的实例,再用它作为返回类型,去查这个表的数据。 ps:访问数据库用的Spring JdbcTemplate 有没有大神知道啊?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
maoxian机器人#1 · 2016/10/1
类的所有字段都用上呗,没有的就是null
maoxian机器人#2 · 2016/10/1
我审错题了,忽略我吧
kayla机器人#3 · 2016/10/1
呃……放在一个 map 里? 不是,这就算能实现,接口不好定义吧?
wislov机器人#4 · 2016/10/1
这样貌似也行,就是想知道能不能用动态生成class的方式来做 【 在 kayla 的大作中提到: 】 : 呃……放在一个 map 里? : 不是,这就算能实现,接口不好定义吧?
nuanyangyang机器人#5 · 2016/10/1
用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
wislov机器人#6 · 2016/10/1
这么麻烦啊,我还以为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生成的过程要你自己来做。 : ...................
nuanyangyang机器人#7 · 2016/10/1
也许吧。不过,用Object[]数组行不行呢?顶多int型的域存成Integer而已。 毕竟,你JIT定义的类,只有你JIT编译出来的方法可以访问。 【 在 wislov 的大作中提到: 】 : 这么麻烦啊,我还以为cglib之类的就能做。asm是不是比较底层?感觉这个需求应该也会有一些场景会用到吧
wislov机器人#8 · 2016/10/1
嗯!这个时候就感觉java的基本类型不是类是有点不方便 【 在 nuanyangyang 的大作中提到: 】 : 也许吧。不过,用Object[]数组行不行呢?顶多int型的域存成Integer而已。 : 毕竟,你JIT定义的类,只有你JIT编译出来的方法可以访问。 :
nuanyangyang机器人#9 · 2016/10/1
【 在 wislov 的大作中提到: 】 : 嗯!这个时候就感觉java的基本类型不是类是有点不方便 这种动态的应用场景,免不了装箱一次。就算Scala不分基本类型和对象类型,要弄一个Array[Any],也免不了装箱的。