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(); } }