现有的Emp类
package bean;
public class Emp {
private String ename;
private int empno;
public Emp(String ename, int empno) {
super();
this.ename = ename;
this.empno = empno;
}
public Emp() {
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public void sayHello(int a) {
System.out.println("sayHello" + a);
}
}
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
public class JavassistTest02 {
public static void main(String[] args) throws Exception {
// test1();
// test2();
// test3();
// test4();
test5();
}
//获取现有类的信息
public static void test1() throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("bean.Emp");
byte[] bytes = cc.toBytecode();
System.out.println(Arrays.toString(bytes));
System.out.println(cc.getName());//获得类名
System.out.println(cc.getSimpleName());//获得简要类名
System.out.println(cc.getSuperclass());//获得父类
System.out.println(cc.getInterfaces());//获得接口
}
//在现有类上产生新的方法
public static void test2() throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("bean.Emp");
//第一种
// CtMethod m = CtNewMethod.make("public int add(int a,int b){return $1+$2}", cc);//$代表形参
//第二种
//定义方法名 方法返回参数类型,输入参数类型
CtMethod m2 = new CtMethod(CtClass.intType, "add", new CtClass[] {CtClass.intType,CtClass.intType},cc);
//定义方法权限
m2.setModifiers(Modifier.PUBLIC);
//定义方法体
m2.setBody("{System.out.println(\"test\");return $1+$2;}");
//在类中添加创建的方法
cc.addMethod(m2);
//通过放射调用创建的方法
Class claz = cc.toClass();
Object obj = claz.newInstance();//通过调用无参构造器创建新的Emp对象
Method m3 = claz.getDeclaredMethod("add", int.class,int.class);
Object result = m3.invoke(obj, 200,300);
System.out.println(result);
}
//在现有方法中修改
public static void test3() throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("bean.Emp");
CtMethod cm = cc.getDeclaredMethod("sayHello",new CtClass[]{CtClass.intType});
cm.insertBefore("System.out.pirntln($1);System.out.pringln(\"start!!!\");");//sayhello方法体前面
Class claz = cc.toClass();
Object obj = claz.newInstance();//通过调用无参构造器创建新的Emp对象
Method m3 = claz.getDeclaredMethod("sayHello", int.class);
Object result = m3.invoke(obj, 200);
System.out.println(result);
}
//在现有类中获取和创建属性
public static void test4() throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("bean.Emp");
// CtField f1 = CtField.make("public int empno", cc);
CtField f1 = new CtField(CtClass.intType, "salary",cc);
f1.setModifiers(Modifier.PUBLIC);
cc.addField(f1);
cc.getDeclaredField("ename");//获得指定属性
//增加响应的set和get方法
cc.addMethod(CtNewMethod.getter("getsalary", f1));
cc.addMethod(CtNewMethod.setter("setsalary", f1));
}
//构造器方法的操作
public static void test5() throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("bean.Emp");
CtConstructor[] ctConstructors = cc.getConstructors();//所有构造器的数组
for (CtConstructor ctConstructor : ctConstructors) {
System.out.println(ctConstructor.getLongName());
}
}
}