测试模型代码:
- package org.study2.JavaSenior.annotation.javassistDemo;
- /**
- * @Auther:GongXingRui
- * @Date:2018/10/30
- * @Description:
- **/
- @Author(name = "gxr", year = 2018)
- 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() {
- }
- }
API 应用代码:
- package org.study2.JavaSenior.annotation.javassistDemo;
- import javassist.*;
- import java.lang.reflect.Method;
- import java.util.Arrays;
- /**
- * @Auther:GongXingRui
- * @Date:2018/10/30
- * @Description: Javassist 常用 API 的应用
- **/
- public class JavassistDemo2 {
- /**
- * 处理类的基本用法
- *
- * @throws Exception
- */
- public static void test01() throws Exception {
- ClassPool pool = ClassPool.getDefault();
- CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.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("org.study2.JavaSenior.annotation.javassistDemo.Emp");
- // CtMethod m = CtNewMethod.make("public int add(int a,int b){return a+b;}", cc);
- CtMethod m = new CtMethod(CtClass.intType, "add",
- new CtClass[]{CtClass.intType, CtClass.intType}, cc);
- m.setModifiers(Modifier.PUBLIC);
- m.setBody("{System.out.println(\"www.sxt.cn\");return $1+$2;}");
- cc.addMethod(m);
- // 通过反射调用新生成的方法
- Class clazz = cc.toClass();
- 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);
- }
- /**
- * 修改已有的方法的信息, 修改方法体的内容
- *
- * @throws Exception
- */
- public static void test03() throws Exception {
- ClassPool pool = ClassPool.getDefault();
- CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
- CtMethod cm = cc.getDeclaredMethod("sayHello", new CtClass[]{CtClass.intType});
- cm.insertBefore("System.out.println($1);System.out.println(\"start!!!\");");
- cm.insertAt(9, "int b=3;System.out.println(\"b=\"+b);");
- cm.insertAfter("System.out.println(\"end!!!\");");
- // 通过反射调用新生成的方法
- Class clazz = cc.toClass();
- Object obj = clazz.newInstance(); // 通过调用 Emp 无参构造器, 创建新的 Emp 对象
- Method method = clazz.getDeclaredMethod("sayHello", int.class);
- method.invoke(obj, 300);
- }
- /**
- * 属性的操作
- *
- * @throws Exception
- */
- public static void test04() throws Exception {
- ClassPool pool = ClassPool.getDefault();
- CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
- // CtField f1 = CtField.make("private int empno;", cc);
- CtField f1 = new CtField(CtClass.intType, "salary", cc);
- f1.setModifiers(Modifier.PRIVATE);
- cc.addField(f1);
- // cc.getDeclaredField("ename"); // 获取指定的属性
- // 增加相应的 set 和 get 方法
- cc.addMethod(CtNewMethod.getter("getSalary", f1));
- cc.addMethod(CtNewMethod.setter("setSalary", f1));
- Class clazz = cc.toClass();
- Object obj = clazz.newInstance();
- Method method = clazz.getDeclaredMethod("setSalary", int.class);
- method.invoke(obj, 2000);
- Method method2 = clazz.getDeclaredMethod("getSalary", null);
- int n = (int) method2.invoke(obj, null);
- System.out.println("Salary=" + n);
- }
- /**
- * 构造方法的操作
- *
- * @throws Exception
- */
- public static void test05() throws Exception {
- ClassPool pool = ClassPool.getDefault();
- CtClass cc = pool.get("org.study2.JavaSenior.annotation.javassistDemo.Emp");
- CtConstructor[] cs = cc.getConstructors();
- for (CtConstructor c : cs) {
- System.out.println(c.getLongName());
- }
- }
- public static void test06() throws Exception {
- CtClass cc = ClassPool.getDefault().get("org.study2.JavaSenior.annotation.javassistDemo.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();
- }
- }
来源: http://www.bubuko.com/infodetail-2828345.html