处理类的基本用法
测试产生新的方法
//通过反射调用新生成的方法
修改已有的方法信息,修改方法体的内容
//通过反射调用新生成的方法
属性的操作
构造方法的操作
获得注解的操作
package com.lzy.assist;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Arrays;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtConstructor;
import javassist.CtField;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.Modifier;
import javassist.NotFoundException;
/**
* 测试javassist的API
*
*
*/
public class Demo02 {
/**
* 处理类的基本用法
* @throws Exception
*/
public static void test01() throws Exception {
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("com.lzy.assist.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());//获得接口
}
/**
* 测试产生新的方法
* @throws Exception
*/
public static void test02() throws Exception {
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("com.lzy.assist.Emp");
//CtMethod m=CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);
//49行与51-54行代码的效果一致
CtMethod m=new CtMethod(CtClass.intType,"add",
new CtClass[] {CtClass.intType,CtClass.intType},cc);
m.setModifiers(Modifier.PUBLIC);//设置方法为public还是private或者其他类型
m.setBody("{System.out.println(\"www.baidu.com\");return $1+$2;}");
cc.addMethod(m);
//通过反射调用新生成的方法
Class clazz=cc.toClass();
Object obj = clazz.getDeclaredConstructor().newInstance(); //通过调用Emp无参构造器,创建新的Emp对象
Method method = clazz.getDeclaredMethod("add", int.class,int.class);
Object result = method.invoke(obj, 200,300);
System.out.println(result);
}
/**
* 修改已有的方法信息,修改方法体的内容
* @param args
* @throws Exception
*/
public static void test03() throws Exception {
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("com.lzy.assist.Emp");
CtMethod cm=cc.getDeclaredMethod("sayHello",new CtClass[] {CtClass.intType});
cm.insertBefore("System.out.println($1);System.out.println(\"start!!!\");");//在sayHello()方法运行前运行该串代码
cm.insertAt(9, "int b=3;System.out.println(\"b=\"+b);");//在第9行后运行该串代码
cm.insertAfter("System.out.println(\"end!!!\");");在sayHello()方法运行后运行该串代码
//通过反射调用新生成的方法
Class clazz=cc.toClass();
Object obj=clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getDeclaredMethod("sayHello", int.class);
method.invoke(obj, 300);
}
/**
* 属性的操作
* @param args
* @throws Exception
*
*/
public static void test04() throws Exception {
ClassPool pool=ClassPool.getDefault();
CtClass cc=pool.get("com.lzy.assist.Emp");
// CtField f1 = CtField.make("private int salary;", cc);
//96行与98-99行代码效果一致
CtField f1 = new CtField(CtClass.intType,"salary",cc);
f1.setModifiers(Modifier.PRIVATE);//设置属性为public还是private或者其他类型
cc.addField(f1);
// cc.getDeclaredField("ename"); //获取指定的属性
//添加方法
//增加相应的set和get方法
cc.addMethod(CtNewMethod.getter("getSalary", f1));;
cc.addMethod(CtNewMethod.getter("setSalary", f1));;
}
/**
* 构造方法的操作
* @throws Exception
*/
public static void test05() throws Exception {
ClassPool pool = ClassPool.getDefault();
CtClass cc = pool.get("com.lzy.assist.Emp");
CtConstructor[] cs = cc.getConstructors();
for (CtConstructor c : cs) {
System.out.println(c.getLongName());
}
}
/**
* 获得注解的操作
* @throws Exception
*/
public static void test06() throws Exception{
CtClass cc = ClassPool.getDefault().get("com.lzy.assist.Emp");
Object[] all = cc.getAnnotations();
Author a = (Author)all[0];
String name = a.name();
int year = a.year();
System.out.println("name: " + name + ", year: " + year);
}
public static void main(String[] args) throws Exception {
test06();
}
}
Emp类
package com.lzy.assist;
@Author(name="lzy", year=2020)
public class Emp {
private int empno;
private String ename;
public void sayHello(int a) {
System.out.println("sayHello,"+a);
}
public int getEmpno() {
return empno;
}
public void setEmpno(int empno) {
this.empno = empno;
}
public String getEname() {
return ename;
}
public void setEname(String ename) {
this.ename = ename;
}
public Emp(int empno, String ename) {
super();
this.empno = empno;
this.ename = ename;
}
public Emp() {
}
}
注解Author
package com.lzy.assist;
public @interface Author {
String name();
int year();
}