转载请说明出处。
首先导入javassit的jar包 下面是我练习时用的jar包
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.1.GA</version>
</dependency>
基础入门的例子
ClassPool pool = ClassPool.getDefault();
//创建class文件
CtClass userClass = pool.makeClass("com.jjn.entity.User");
//创建id属性 创建name属性
CtField idField = CtField.make("private Integer id;", userClass);
CtField nameField = CtField.make("private String name;", userClass);
//添加属性
userClass.addField(idField);
userClass.addField(nameField);
//创建方法
CtMethod getIdMethod = CtMethod.make("public Integer getId() {return id;}", userClass);
CtMethod setIdMethod = CtMethod.make("public void setId(Integer id) { this.id=id; }", userClass);
CtMethod getNameMethod = CtMethod.make("public String getName() { return name; }", userClass);
CtMethod setNameMethod = CtMethod.make("public void setName(String name) { this.name=name; }", userClass);
//添加方法
userClass.addMethod(getIdMethod);
userClass.addMethod(setIdMethod);
userClass.addMethod(getNameMethod);
userClass.addMethod(setNameMethod);
//添加构造器
CtConstructor ctConstructor=new CtConstructor( new CtClass[] {
CtClass.intType,pool.get("java.lang.String")
},userClass);
//创建body
ctConstructor.setBody("{this.id=id;this.name=name;}");
userClass.addConstructor(ctConstructor);
//将构造好的类写入到D:\test目录下
userClass.writeFile("D:/test");
一些基本的API使用 修改方法的内容 实现前置增强 后置增强
注意当CtClass 调用writeFile()、toClass()、toBytecode() 这些方法的时候,Javassist会冻结CtClass Object,对CtClass object的修改将不允许。这个主要是为了警告开发者该类已经被加载,而JVM是不允许重新加载该类的。如果要突破该限制,方法如下:userClass.defrost();
ClassPool pool = ClassPool.getDefault();
//加载类的信息
CtClass userClass = pool.get("com.itmayiedu.Demo01");
CtMethod ctMethod1 =CtMethod.make("public int add(int a,int b){ System.out.println(\" User1 \");\n return a+b;}", userClass);
userClass.addMethod(ctMethod1);
userClass.writeFile("D:/test");
userClass.defrost();
/方法执行前插入
CtMethod cm = userClass.getDeclaredMethod("add", new CtClass[]{CtClass.intType,CtClass.intType});
cm.insertBefore("System.out.println($1=3);System.out.println(\"....start....\");");
//方法执行后插入
cm.insertAfter("System.out.println(\"...end...\");");
//使用反射技术执行代码
Class clazz = userClass.toClass();
Object newInstance = clazz.newInstance();
Method method = clazz.getDeclaredMethod("add", int.class,int.class);
Object obj = method.invoke(newInstance, 2,2);
System.out.println(obj);