注:需导入javasist-*.jar包
一、Javasist生成新的类
package com.org.asist;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
public class Ceshi01 {
public static void main(String[] args) throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.makeClass("com.org.asist.Staff");
//创建属性
CtField f1 = CtField.make("private String staffNo;", cc);
CtField f2 = CtField.make("private String staffName;", cc);
cc.addField(f1);
cc.addField(f2);
//创建方法
CtMethod method = CtMethod.make("public String getStaffNo(){return staffNo;}", cc);
CtMethod method2 = CtMethod.make("public void setStaffNo(){this.staffNo = staffNo;}", cc);
cc.addMethod(method);
cc.addMethod(method2);
//添加构造器
CtConstructor constructor = new CtConstructor(new CtClass[]{pool.get("java.lang.String"),pool.get("java.lang.String")}, cc);
//添加方法体
constructor.setBody("{this.staffNo = staffNo;this.staffName = staffName;}");
cc.addConstructor(constructor);
//写入工作空间
cc.writeFile("d:/myjava");
}
}
二、Javasist操作API
package com.org.asist;
import java.lang.reflect.Method;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Modifier;
public class Ceshi02 {
//处理类的基本方法
public static void test01() throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.org.asist.Staff");
System.out.println(cc.getName());
System.out.println(cc.getPackageName());
System.out.println(cc.getConstructors()[0]);
System.out.println(cc.getClass());
}
//测试产生新的方法
public static void test02() throws Exception{
ClassPool pool = ClassPool.getDefault();
//CtClass cc = pool.get("com.org.asist.Staff");
CtClass cc = pool.makeClass("com.org.asist.Staff");
//CtMethod m = CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);
System.out.println(cc.getSimpleName());
//创建方法
CtMethod m = new CtMethod(CtClass.intType, "add", new CtClass[]{CtClass.intType,CtClass.intType},cc);
m.setModifiers(Modifier.PUBLIC);
m.setBody("{return $1+$2;}");//$1、$2表示占位符
cc.addMethod(m);
Class clazz = cc.toClass();
Object object = clazz.newInstance();//通过无参构造器,创建一个新的对象
Method method = clazz.getDeclaredMethod("add", int.class,int.class);
Object result = method.invoke(object, 200,300);
System.out.println(result);
}
/**
* 任意修改已有的方法信息(类似于aop底层实现)
* @throws Exception
*/
public static void test03() throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.org.asist.Staff");
CtMethod cm = cc.getDeclaredMethod("sayHello", new CtClass[]{pool.get("java.lang.String")});
cm.insertBefore("System.out.println($1);");
cm.insertAfter("System.out.println(\"我靠你妹的\");");
Class clazz = cc.toClass();
Object object = clazz.newInstance();//通过无参构造器,创建一个新的对象
Method method = clazz.getDeclaredMethod("sayHello", String.class);
Object result = method.invoke(object, "你妹");
System.out.println(result);
}
/**
* 属性操作
* @throws Exception
*/
public static void test04() throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.org.asist.Staff");
CtField field = new CtField(CtClass.intType, "age", cc);
field.setModifiers(Modifier.PRIVATE);
cc.addField(field);
cc.addMethod(CtNewMethod.getter("getAge", field));
cc.addMethod(CtNewMethod.getter("setAge", field));
}
/**
* 操作构造器
* @throws Exception
*/
public static void test05() throws Exception{
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.org.asist.Staff");
CtConstructor[] con = cc.getConstructors();
for (CtConstructor ctConstructor : con) {
System.out.println(ctConstructor);
}
}
public static void main(String[] args) throws Exception {
test02();
}
}