动态生成JAVA代码<!----><o:p></o:p>
BCEL即Bytecode Engineering Library,它是一个第三方的字节码生成库,能帮助我们在内存中直接生成Java字节码。BCEL是一个源代码开放的免费代码库(http://sourceforge.net/projects/bcel/),可以帮助我们分析、创建、处理二进制的Java字节码。本文将说明任何用BCEL来动态生成JAVA代码。<o:p></o:p>
/*<o:p></o:p>
?* 创建日期 2004-7-2<o:p></o:p>
?* 创建人 HongSoft<o:p></o:p>
?* 文件名 TestBCEL.java<o:p></o:p>
?*/<o:p></o:p>
package com.hongsoft.test;<o:p></o:p>
<o:p>?</o:p>
import java.io.*;<o:p></o:p>
import java.util.Stack;<o:p></o:p>
//从sourceforge.net/projects/bcel/下载BCEL代码库<o:p></o:p>
import de.fub.bytecode.classfile.*;<o:p></o:p>
import de.fub.bytecode.generic.*;<o:p></o:p>
import de.fub.bytecode.Constants;<o:p></o:p>
<o:p>?</o:p>
public class TestBCEL? extends ClassLoader {<o:p></o:p>
??? private Object o;<o:p></o:p>
??? public static void? main(String[] args) {<o:p></o:p>
??? ??? ???new TestBCEL ();?????? <o:p></o:p>
}<o:p></o:p>
<o:p>?</o:p>
??? public? TestBCEL ()<o:p></o:p>
?????? {<o:p></o:p>
?????????? ?????? <o:p></o:p>
????????????? // 声明类, Trouble_ticket是类名, 超类是java.lang.Object<o:p></o:p>
?????????????? //ACC代表access, new String[]{}是它要实现的接口的数组<o:p></o:p>
??????? ???????//效果:public Trouble_ticket{}<o:p></o:p>
????????????? ClassGen classgen <o:p></o:p>
????????????????? ?? = new ClassGen("Trouble_ticket", "java.lang.Object", "",??????? ?? Constants.ACC_PUBLIC | Constants.ACC_SUPER,new String[]{});<o:p></o:p>
??????? <o:p></o:p>
????????????? ? //常量池 <o:p></o:p>
ConstantPoolGen cp = classgen.getConstantPool();<o:p></o:p>
???? <o:p></o:p>
????????????????? //构造属性,效果: public String creater=””;<o:p></o:p>
????????????? ?? FieldGen fg=new FieldGen(Constants.ACC_PUBLIC, Type.STRING,??????????? ?? "creater",cp);<o:p></o:p>
????????????????? //加入field<o:p></o:p>
????????????? ?? classgen.addField(fg.getField());<o:p></o:p>
?????? <o:p></o:p>
???????????????????? ? // 构造函数?????????????????? ? ?????????????????? ??classgen.addEmptyConstructor(Constants.ACC_PUBLIC);<o:p></o:p>
???????????????????? ? //Byte形式<o:p></o:p>
???????????????????? ? byte[] data = classgen.getJavaClass().getBytes();<o:p></o:p>
???????????????????? ? //生成类<o:p></o:p>
???????????????????? ? Class c = defineClass(data, 0, data.length);<o:p></o:p>
???????????????????? ? try {<o:p></o:p>
???????????????????????? ? o= c.newInstance();<o:p></o:p>
?????????????????? ???????? //程序效果?????????????? <o:p></o:p>
???????????????????????? System.out.println(o.getClass().getName());<o:p></o:p>
???????????????????????? System.out.println(o.getClass().getField("creater").getName());??? ???????????????????? <o:p></o:p>
???????????????????????? System.out.println(classgen.getFields().length);<o:p></o:p>
???????????????????? ? } catch (IllegalAccessException e) {<o:p></o:p>
???????????????????????? ? throw new RuntimeException(e.getMessage());<o:p></o:p>
???????????????????? ? } catch (Exception e) {<o:p></o:p>
???????????????????????? ? throw new RuntimeException(e.getMessage());<o:p></o:p>
???????????????????? ? } <o:p></o:p>
?????? }<o:p></o:p>
??? <o:p></o:p>
}<o:p></o:p>
程序运行结果如下:<o:p></o:p>
Trouble_ticket<o:p></o:p>
creater<o:p></o:p>
1<o:p></o:p>