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