动态生成JAVA代码

BCEL即Bytecode Engineering Library,它是一个第三方的字节码生成库,能帮助我们在内存中直接生成Java字节码。BCEL是一个源代码开放的免费代码库(http://sourceforge.net/projects/bcel/),可以帮助我们分析、创建、处理二进制的Java字节码。本文将说明任何用BCEL来动态生成JAVA代码。

/* 
   
?* 创建日期 2004-7-2 
   
?* 创建人 HongSoft 
   
?* 文件名 TestBCEL.java 
   
?*/ 
   
packagecom.hongsoft.test; 
   
 
   
     ? 
   
.*; 
   
importjava.util.Stack; 
   
//从sourceforge.net/projects/bcel/下载BCEL代码库 
   
importde.fub.bytecode.classfile.*; 
   
importde.fub.bytecode.generic.*; 
   
importde.fub.bytecode.Constants; 
   
 
   
     ? 
   
publicclass TestBCEL? extends ClassLoader { 
   
??? private Object o; 
   
??? public static void? main(String[] args) { 
   
??? ??? ???new TestBCEL ();??????  
   
} 
   
 
   
     ? 
   
??? public? TestBCEL () 
   
?????? { 
   
?????????? ??????  
   
????????????? // 声明类, Trouble_ticket是类名, 超类是java.lang.Object 
    
?????????????? //ACC代表access, newString[]{}是它要实现的接口的数组 
    
??????? ???????//效果:public Trouble_ticket{} 
   
????????????? ClassGen classgen 
   
????????????????? ?? = new ClassGen("Trouble_ticket", "java.lang.Object", "",??????? ?? Constants.ACC_PUBLIC | Constants.ACC_SUPER,new String[]{}); 
   
???????  
   
????????????? ? //常量池 
   
ConstantPoolGencp = 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