`
hongsoft
  • 浏览: 292757 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

动态生成JAVA代码

阅读更多

动态生成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>

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics