java中javassist、ClassPool、CtClass、Apache CC2链学习
https://blog.csdn.net/qq_41874930/article/details/121273650
https://www.cnblogs.com/cqqfboy/p/14785380.html
可以用字符串写一个类,并加入到程序中,也可以操作这个类的代码。
1. 什么是javassist
javassist是一个处理Java字节码的jar包,里面有很多类。2. 什么是ClassPool
可以想象成一个容器,里面放着指定路径下的class文件,使用javassist对类进行操作的时候,必须先创建一个ClassPool。
它也可以暂时存放我们编辑的class文件,等写完后再拿出来放到指定的位置。我们对class文件的操作是在ClassPool中的进行的。
假如我们想获取一个Class文件进行修改,如果ClassPool的路径中没有它,那么我们是找不到的,必须使用insertClassPath();函数将class文件路径导入ClassPool中才可以。
如果我们不自定义路径,那么它的类的搜索路径包括平台库、扩展库以及由-classpath选项或CLASSPATH环境变量指定的搜索路径。
3. 什么是CtClass
CtClass是javassist中的一个类文件,它的对象可以理解成一个class文件的抽象表示。
一个CtClass对象可以用来修改一个class文件。
4. 写一个Class文件test.class
import javassist.ClassPool; import javassist.CtClass; import javassist.CtField; import javassist.CtMethod; import java.io.FileOutputStream; public class JavasistTest { public static void main(String[] args) throws Exception{ //默认的类搜索路径 ClassPool pool = ClassPool.getDefault(); //获取一个ctClass对象 CtClass ctClass = pool.makeClass("Test"); try { //添加age属性 ctClass.addField(CtField.make("private int age;", ctClass)); //添加setAge方法 ctClass.addMethod(CtMethod.make("public void setAge(int age){this.age = age;}", ctClass)); //添加getAge方法 ctClass.addMethod(CtMethod.make("public int getAge(){return this.age;}", ctClass)); //将ctClass生成字节数组,并写入文件 byte[] byteArray = ctClass.toBytecode(); FileOutputStream output = new FileOutputStream("/Users/zhujiayu/IdeaProjects/untitled/out/production/untitled/Test.class"); output.write(byteArray); output.close(); System.out.println("文件写入成功!!!"); } catch (Exception e) { e.printStackTrace(); } } }