Javassist可以像ASM一样动态的创建出一个类的二进制,不过使用Javassist可比ASM简单了不少,假设我们需要生成一个JavassistHelloWorld类,代码如下:

    1. package com.anbai.sec.bytecode.javassist;
    2. public class JavassistHelloWorld {
    3. private static String content = "Hello world~";
    4. public static void main(String[] args) {
    5. System.out.println(content);
    6. }
    7. }


    使用Javassist生成类字节码示例:**

    1. package com.anbai.sec.bytecode.javassist;
    2. import javassist.ClassPool;
    3. import javassist.CtClass;
    4. import javassist.CtField;
    5. import javassist.CtMethod;
    6. import org.javaweb.utils.FileUtils;
    7. import java.io.File;
    8. public class JavassistTest {
    9. public static void main(String[] args) {
    10. // 创建ClassPool对象
    11. ClassPool classPool = ClassPool.getDefault();
    12. // 使用ClassPool创建一个JavassistHelloWorld类
    13. CtClass ctClass = classPool.makeClass("com.anbai.sec.bytecode.javassist.JavassistHelloWorld");
    14. try {
    15. // 创建类成员变量content
    16. CtField ctField = CtField.make("private static String content = \"Hello world~\";", ctClass);
    17. // 将成员变量添加到ctClass对象中
    18. ctClass.addField(ctField);
    19. // 创建一个主方法并输出content对象值
    20. CtMethod ctMethod = CtMethod.make(
    21. "public static void main(String[] args) {System.out.println(content);}", ctClass
    22. );
    23. // 将成员方法添加到ctClass对象中
    24. ctClass.addMethod(ctMethod);
    25. File classFilePath = new File(new File(System.getProperty("user.dir"), "javaweb-sec-source/javase/src/main/java/com/anbai/sec/bytecode/javassist/"), "JavassistHelloWorld.class");
    26. // 使用类CtClass,生成类二进制
    27. byte[] bytes = ctClass.toBytecode();
    28. // 将class二进制内容写入到类文件
    29. FileUtils.writeByteArrayToFile(classFilePath, bytes);
    30. } catch (Exception e) {
    31. e.printStackTrace();
    32. }
    33. }
    34. }