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("执行结束");    }}


生成class文件之后,可以适用XJad反编译工具反编译成 .java文件

XJax下载地址

原创粉丝点击