javaassist库的API详解 package java_217_字节码操作_javaassist库_介绍_API详解_练习;
import java.lang.reflect.Method; import java.util.Arrays; import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import javassist.Modifier; /**
测试javaassist的API:
javaassist库的API详解:
1.修改已有方法的方法体(插入代码到已有的方法体)
2.新增方法
3.删除方法 / public class Demo02 { /*
处理类的基本用法
@throws Exception */ public static void test01() throws Exception{ //获取对象 ClassPool pool = ClassPool.getDefault(); //获得某个指定的类 CtClass cc = pool.get(“java_217_字节码操作_javaassist库_介绍_API详解_练习.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(); /* if(CtClass.isFrozen()){ CtClass.defrost(); }*/ //获得某个指定的类 CtClass cc = pool.get(“java_217_字节码操作_javaassist库_介绍_API详解_练习.Emp”);
//CtMethod m = CtNewMethod.make(“public int add(int a,int b){return a+b;}”, cc);
//如果一个CtClass对象通过writeFile(),toClass()或者toByteCode()转换成class文件,那么javassist会冻结这个CtClass对象。 //后面就不能修改这个CtClass对象了。这样是为了警告开发者不要修改已经被JVM加载的class文件,因为JVM不允许重新加载一个类。加入cc.defrost();问题便得到了解决。
cc.defrost(); CtMethod m = new CtMethod(CtClass.intType,“add”, new CtClass[]{CtClass.intType,CtClass.intType}, cc);
m.setModifiers(Modifier.PUBLIC); m.setBody("{System.out.println(“新的数据”);return $1+$2;}");//出现报错 把a+b换成占位符$1+$2 cc.addMethod(m);
//通过反射调用新的方法 Class clazz = cc.toClass();//转化为class对象 //创建新的对象 Object obj = clazz.newInstance();//通过调用Emp无参构造器,创建新的Emp对象 //获得方法 Method method = clazz.getDeclaredMethod(“add”, int.class,int.class); Object result = method.invoke(obj, 200,300); System.out.println(result);
}
public static void main(String[] args) throws Exception { test01(); System.out.println("================="); test02(); } } //---------------------------------------------- package java_216_字节码操作_javaassist库_介绍_动态创建新类_属性_方法_构造器_练习; /**
创建一个类
*/ public class Emp {//Emp雇员 private int empno;//员工编号 private String ename;//员工姓名 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() {
super();
}
public Emp(int empno, String ename) {
super();
this.empno = empno;
this.ename = ename;
}
} //结果------------------------------------ [-54, -2, -70, -66, 0, 0, 0, 52, 0, 33, 7, 0, 2, 1, 0, 66, 106, 97, 118, 97, 95, 50, 49, 55, 95, -27, -83, -105, -24, -118, -126, -25, -96, -127, -26, -109, -115, -28, -67, -100, 95, 106, 97, 118, 97, 97, 115, 115, 105, 115, 116, -27, -70, -109, 95, -28, -69, -117, -25, -69, -115, 95, 65, 80, 73, -24, -81, -90, -24, -89, -93, 95, -25, -69, -125, -28, -71, -96, 47, 69, 109, 112, 7, 0, 4, 1, 0, 16, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 79, 98, 106, 101, 99, 116, 1, 0, 5, 101, 109, 112, 110, 111, 1, 0, 1, 73, 1, 0, 5, 101, 110, 97, 109, 101, 1, 0, 18, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 1, 0, 8, 103, 101, 116, 69, 109, 112, 110, 111, 1, 0, 3, 40, 41, 73, 1, 0, 4, 67, 111, 100, 101, 9, 0, 1, 0, 13, 12, 0, 5, 0, 6, 1, 0, 15, 76, 105, 110, 101, 78, 117, 109, 98, 101, 114, 84, 97, 98, 108, 101, 1, 0, 18, 76, 111, 99, 97, 108, 86, 97, 114, 105, 97, 98, 108, 101, 84, 97, 98, 108, 101, 1, 0, 4, 116, 104, 105, 115, 1, 0, 68, 76, 106, 97, 118, 97, 95, 50, 49, 55, 95, -27, -83, -105, -24, -118, -126, -25, -96, -127, -26, -109, -115, -28, -67, -100, 95, 106, 97, 118, 97, 97, 115, 115, 105, 115, 116, -27, -70, -109, 95, -28, -69, -117, -25, -69, -115, 95, 65, 80, 73, -24, -81, -90, -24, -89, -93, 95, -25, -69, -125, -28, -71, -96, 47, 69, 109, 112, 59, 1, 0, 8, 115, 101, 116, 69, 109, 112, 110, 111, 1, 0, 4, 40, 73, 41, 86, 1, 0, 8, 103, 101, 116, 69, 110, 97, 109, 101, 1, 0, 20, 40, 41, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 9, 0, 1, 0, 23, 12, 0, 7, 0, 8, 1, 0, 8, 115, 101, 116, 69, 110, 97, 109, 101, 1, 0, 21, 40, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 6, 60, 105, 110, 105, 116, 62, 1, 0, 3, 40, 41, 86, 10, 0, 3, 0, 29, 12, 0, 26, 0, 27, 1, 0, 22, 40, 73, 76, 106, 97, 118, 97, 47, 108, 97, 110, 103, 47, 83, 116, 114, 105, 110, 103, 59, 41, 86, 1, 0, 10, 83, 111, 117, 114, 99, 101, 70, 105, 108, 101, 1, 0, 8, 69, 109, 112, 46, 106, 97, 118, 97, 0, 33, 0, 1, 0, 3, 0, 0, 0, 2, 0, 2, 0, 5, 0, 6, 0, 0, 0, 2, 0, 7, 0, 8, 0, 0, 0, 6, 0, 1, 0, 9, 0, 10, 0, 1, 0, 11, 0, 0, 0, 47, 0, 1, 0, 1, 0, 0, 0, 5, 42, -76, 0, 12, -84, 0, 0, 0, 2, 0, 14, 0, 0, 0, 6, 0, 1, 0, 0, 0, 11, 0, 15, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 16, 0, 17, 0, 0, 0, 1, 0, 18, 0, 19, 0, 1, 0, 11, 0, 0, 0, 62, 0, 2, 0, 2, 0, 0, 0, 6, 42, 27, -75, 0, 12, -79, 0, 0, 0, 2, 0, 14, 0, 0, 0, 10, 0, 2, 0, 0, 0, 14, 0, 5, 0, 15, 0, 15, 0, 0, 0, 22, 0, 2, 0, 0, 0, 6, 0, 16, 0, 17, 0, 0, 0, 0, 0, 6, 0, 5, 0, 6, 0, 1, 0, 1, 0, 20, 0, 21, 0, 1, 0, 11, 0, 0, 0, 47, 0, 1, 0, 1, 0, 0, 0, 5, 42, -76, 0, 22, -80, 0, 0, 0, 2, 0, 14, 0, 0, 0, 6, 0, 1, 0, 0, 0, 17, 0, 15, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 16, 0, 17, 0, 0, 0, 1, 0, 24, 0, 25, 0, 1, 0, 11, 0, 0, 0, 62, 0, 2, 0, 2, 0, 0, 0, 6, 42, 43, -75, 0, 22, -79, 0, 0, 0, 2, 0, 14, 0, 0, 0, 10, 0, 2, 0, 0, 0, 20, 0, 5, 0, 21, 0, 15, 0, 0, 0, 22, 0, 2, 0, 0, 0, 6, 0, 16, 0, 17, 0, 0, 0, 0, 0, 6, 0, 7, 0, 8, 0, 1, 0, 1, 0, 26, 0, 27, 0, 1, 0, 11, 0, 0, 0, 51, 0, 1, 0, 1, 0, 0, 0, 5, 42, -73, 0, 28, -79, 0, 0, 0, 2, 0, 14, 0, 0, 0, 10, 0, 2, 0, 0, 0, 24, 0, 4, 0, 25, 0, 15, 0, 0, 0, 12, 0, 1, 0, 0, 0, 5, 0, 16, 0, 17, 0, 0, 0, 1, 0, 26, 0, 30, 0, 1, 0, 11, 0, 0, 0, 89, 0, 2, 0, 3, 0, 0, 0, 15, 42, -73, 0, 28, 42, 27, -75, 0, 12, 42, 44, -75, 0, 22, -79, 0, 0, 0, 2, 0, 14, 0, 0, 0, 18, 0, 4, 0, 0, 0, 27, 0, 4, 0, 28, 0, 9, 0, 29, 0, 14, 0, 30, 0, 15, 0, 0, 0, 32, 0, 3, 0, 0, 0, 15, 0, 16, 0, 17, 0, 0, 0, 0, 0, 15, 0, 5, 0, 6, 0, 1, 0, 0, 0, 15, 0, 7, 0, 8, 0, 2, 0, 1, 0, 31, 0, 0, 0, 2, 0, 32] java_217_字节码操作_javaassist库_介绍_API详解_练习.Emp Emp javassist.CtClassType@3279cf[public class java.lang.Object fields= constructors=javassist.CtConstructor@1dc4ec2[public Object ()V], javassist.CtConstructor@133314b[static ()V], methods=javassist.CtMethod@191491da[private static native registerNatives ()V], javassist.CtMethod@70ae6c43[public final native getClass ()Ljava/lang/Class;], javassist.CtMethod@c13165c[public native hashCode ()I], javassist.CtMethod@87a44f24[public equals (Ljava/lang/Object;)Z], javassist.CtMethod@33a3ff1e[protected native clone ()Ljava/lang/Object;], javassist.CtMethod@69cb6c6d[public toString ()Ljava/lang/String;], javassist.CtMethod@5e7eee0a[public final native notify ()V], javassist.CtMethod@96773899[public final native notifyAll ()V], javassist.CtMethod@42889db2[public final native wait (J)V], javassist.CtMethod@e8b1c97[public final wait (JI)V], javassist.CtMethod@d0990d36[public final wait ()V], javassist.CtMethod@919e519f[protected finalize ()V], ] [Ljavassist.CtClass;@11bc7ed
新的数据 500