javassist学习:对已有类进行字节码操作
1.已有一个User类:如下
package com.buaa.javassist;
public class User {
private String name;
private int age;
public void sayHello(int a){
System.out.println("sayHello:" + a);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User() {
}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
2.对已有的类进行操作,创建一个新的方法;往已有的方法中加入新语句:如下
package com.buaa.javassist;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
public class Demo01 {
public static void test01() throws Exception{
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("com.buaa.javassist.User");
byte[] bytes = cc.toBytecode();
System.out.println(Arrays.toString(bytes));
Class clazz = cc.toClass();
System.out.println(cc.getName());
System.out.println(cc.getSimpleName());
}
public static void test02() throws Exception{
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("com.buaa.javassist.User");
//字节码操作:类中创建一个新方法 add()
CtMethod cm = new CtMethod(CtClass.intType,"add",
new CtClass[]{CtClass.intType,CtClass.intType},cc);
cm.setModifiers(Modifier.PUBLIC);
cm.setBody("{return $1+$2;}");
cc.addMethod(cm);
//反射机制调用上面创建的方法
Class<User> clazz = (Class<User>)cc.toClass();
User user = (User)clazz.newInstance();
Method m = clazz.getDeclaredMethod("add", int.class,int.class);
Object result = m.invoke(user, 10,20);
System.out.println(result);
}
public static void test03() throws Exception{
ClassPool cp = ClassPool.getDefault();
CtClass cc = cp.get("com.buaa.javassist.User");
//方法执行前插入
CtMethod cm = cc.getDeclaredMethod("sayHello", new CtClass[]{CtClass.intType});
cm.insertBefore("System.out.println($1);System.out.println(\"....start....\");");
//方法执行后插入
cm.insertAfter("System.out.println(\"...end...\");");
//某一行前插入
cm.insertAt(8, "System.out.println(\"...这是第八行...\");");
//反射机制调用方法
Class clazz = cc.toClass();
Object obj = clazz.newInstance();
Method m = clazz.getDeclaredMethod("sayHello", int.class);
Object result = m.invoke(obj, 200);
}
public static void main(String[] args) throws Exception {
//test01();
//test02();
test03();
}
}