java在运行时产生一个新的类
来源:互联网 发布:《java编程语言》 编辑:程序博客网 时间:2024/05/16 10:40
gradle依赖: compile group: 'org.javassist', name: 'javassist', version: '3.21.0-GA'
package org.generate;import javassist.*;import java.io.File;import java.io.FileOutputStream;/** * Created by flysLi on 2017/8/30. */public class GenerateNewClassByJavassist { public static void main(String[] args) throws Exception { //初始化容器 ClassPool pool = ClassPool.getDefault(); //通过cp生成一个public新类Emp.java CtClass ctClass = pool.makeClass("org.generate.Emp.java"); //制造字段,首先制造私有化的字段 CtField enameField = new CtField(pool.getCtClass("java.lang.String"), "ename", ctClass); //设为私有化 enameField.setModifiers(Modifier.PRIVATE); //添加至类中 ctClass.addField(enameField); //给字段添加get、set方法 ctClass.addMethod(CtNewMethod.getter("getEname", enameField)); ctClass.addMethod(CtNewMethod.setter("setEname", enameField)); //制造构造函数 CtConstructor ctConstructor = new CtConstructor(new CtClass[]{}, ctClass); //为构造函数设置函数体 StringBuffer buffer = new StringBuffer(); buffer.append("{\n") .append("ename=\"yy\";\n") .append("\n}"); ctConstructor.setBody(buffer.toString()); //将构造函数添加到新类中 ctClass.addConstructor(ctConstructor); //添加自定义方法 CtMethod ctMethod = new CtMethod(CtClass.voidType, "printInfo", new CtClass[]{}, ctClass); //设置自定义方法的修饰符 ctMethod.setModifiers(Modifier.PUBLIC); //为自定义方法设置函数体 StringBuffer buffer2 = new StringBuffer(); buffer2.append("{\nSystem.out.println(\"begin!\");\n") .append("System.out.println(ename);\n") .append("System.out.println(\"over!\");\n") .append("}"); ctMethod.setBody(buffer2.toString()); ctClass.addMethod(ctMethod); //为了验证效果,下面使用反射执行方法printInfo Class<?> clazz = ctClass.toClass(); Object obj = clazz.newInstance(); obj.getClass().getMethod("printInfo", new Class[]{}).invoke(obj, new Object[]{}); /*把生成的class文件写入硬盘*/ String path = "D:\\学习\\生成java\\Emp.class"; byte[] byArr = ctClass.toBytecode(); FileOutputStream fos = new FileOutputStream(new File(path)); fos.write(byArr); fos.close(); System.out.println("执行结束"); }}
XJax下载地址
阅读全文
1 0
- java在运行时产生一个新的类
- MySQL新建一个数据库的时,产生的新文件在哪?
- 一个新基因的产生
- 一个程序的产生和运行过程
- eclipse下,每次运行程序时,新启动Android模拟器(在已经有一个模拟器运行的情况)
- 一个类的产生
- Code62在运行时产生随机数
- 一个只能在堆产生对象的类实现
- 运行时产生as类
- java 产生一个Java的内存泄露
- 从最近一个项目中的问题产生的新认识
- 关于socket一个新的连接是否会产生一个新的socket通信
- [开源]ApolloClr一个新的IL解释器,并且能运行在Web上
- Python 运行时为啥会产生一个叫__pycache__的文件夹
- 一个在ksh中运行java程序的例子
- 产生新的理解
- 在代码中使用新产生的GUID
- 在java中用String new一个新对象时
- CentOS 7 升级内核
- it's never too late to start a new life
- excel文件拷贝
- MPLAB X IDE如何支持中文注释
- POJ3468 A Simple Problem with Integers 线段树模板
- java在运行时产生一个新的类
- 解决 macos Sierra 系统「安全性与隐私」设置中没有任何来源选项问题
- 脉动阵列在二维矩阵乘法及卷积运算中的应用
- 11:计算浮点数相除的余数
- 初步学习触发器
- 复习总结08:Scala基础
- 算法:动态规划——最长公共子序列(LCS)
- 学习计算机的体会与认识
- spring boot(六)如何优雅的使用mybatis