动态生成JAVA代码
来源:互联网 发布:网络电商平台介绍 编辑:程序博客网 时间:2024/04/28 16:52
动态生成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
- 动态生成JAVA代码
- 动态生成JAVA代码
- 动态生成JAVA代码
- 动态生成JAVA代码
- 动态生成JAVA代码(二)
- 动态生成JAVA代码(三)
- 动态生成JAVA代码(一)
- 动态生成JAVA代码(二)
- 动态生成JAVA代码(三)
- 动态生成JAVA代码(二)
- 动态生成JAVA代码(三)
- 动态生成JAVA代码(二)
- Java中代码动态生成
- java代码动态生成控件
- 动态生成JAVA代码的方法zz
- 生成动态代理的通用java代码
- Java查看动态代理生成的代码
- 动态生成代码程序
- 深入浅出JVM(一)---两种环境
- JSON,一种更好的XAML
- 动态生成JAVA代码(三)
- 四原则与引退
- 动态生成JAVA代码(二)
- 动态生成JAVA代码
- Shark与Adapter设计模式
- 从零开始学Shark(3)--编译
- 使用TableDiff实用工具解决事务复制中的问题
- 从零开始学Shark(2)--下载
- 从零开始学Shark(1)--序
- C#的CSREPL-REPL
- shark接口1分析(三)--resume流程
- MS 的Surface