有三种方式根据配置文件生成JAVA类:
第一:
是我们自己实现一个工具,手工调用来根据配置文件生成Java源代码,这种方式就是代码生成器之类的工具。
这种方式的好处是可以在开发过程中生成类文件,然后在其他代码中正常调用而不需要反射来调用,缺点是无法在运行期修改配置文件后让类同步更改。
第二:
在程序运行时,根据配置文件生成Java源代码,然后调用javac来编译,与Servlet Container处理JSP的机制一样。
这种方式的好处是容易理解,可以在运行期修改配置文件,并且让类同步更改;缺点是在编译类时会启动一个Javac进程,在物理资源紧张的情况下,可能造成内存溢出之类的错误,甚至会导致无法启动编译器;这种方式需要以反射方式来调用生成的类。
第三:
是使用一些开源的字节码工具,在运行时根据配置文件动态创建class的字节码,然后再通过反射方式调用类。
这种方式的好处是在运行时动态生成类,配置文件改变了,下次启动时动态类随之改变;缺点是早期的字节码工具需要对Java类结构和JVM指令有一定了解,不过现在已经有很多字节码工具已经有了很较大的发展,不再需要了解Java类结构和JVM指令。
这一类的字节码工具有不少,常见的(从 http://www.open-open.com/54.htm 上摘录了一些):
===============================
CGLIB
cglib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。Hibernate用它来实现PO字节码的动态生成。
ObjectWeb ASM ( 也有人简称之为 ASM )
ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为。Java class 被存储在严格格式定义的 .class 文件里,这些类文件拥有足够的元数据来解析类中的所有元素:类名称、方法、属性以及 Java 字节码(指令)。ASM 从类文件中读入信息后,能够改变类行为,分析类信息,甚至能够根据用户要求生成新类。
ObjectWeb ASM轻量级的Java字节码处理框架。它可以动态生成二进制格式的stub类或其他代理类,或者在类被JAVA虚拟机装入内存之前,动态修改类。ASM 提供了与 BCEL和SERP相似的功能,只有22K的大小,比起350K的BCEL和150K的SERP来说,是相当小巧的,并且它有更高的执行效率,是BCEL的7倍,SERP的11倍以上。
Javassist
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京技术学院的数学和计算机科学系的 Shigeru Chiba 所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。
BECL
Byte Code Engineering Library (BCEL),这是Apache Software Foundation 的Jakarta 项目的一部分。BCEL是 Java classworking 最广泛使用的一种框架,它可以让您深入 JVM 汇编语言进行类操作的细节。BCEL与Javassist 有不同的处理字节码方法,BCEL在实际的JVM 指令层次上进行操作(BCEL拥有丰富的JVM 指令级支持)而Javassist 所强调的源代码级别的工作。
Cojen
Cojen是一个动态Java字节码生成和分解工具。使用一个建造器来方便地生成代码,而不用再选择精确的指令。Cojen提供的工具类演示了代码生成器和加载器的使用。
JClassLib
JClassLib不但是一个字节码阅读器而且还包含一个类库允许开发者读取,修改,写入Java Class文件与字节码。
SERP
SERP字节码框架提供一组高级的APIs进行字节码各主方面的操作。SERP字节码框架能够使你不需要明白class文件格式与JVM 指令就可以轻松完成bytecode 操作
JBET
通过JBET(Java Binary Enhancement Tool )的API可对Class文件进行分解,重新组合,或被编辑。JBET也可以创建新的Class文件。JBET用一种结构化的方式来展现Javabinary (.class)文件的内容,并且可以很容易的进行修改。