java在运行时产生一个新的类

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下载地址

猜你喜欢

转载自blog.csdn.net/qq_33727275/article/details/77718528
今日推荐