/*** 测试使用javassist生成一个新的类**/
class Demo01 {public static void main(String[] args) throws Exception {ClassPool pool = ClassPool.getDefault();CtClass cc = pool.makeClass("com.bjsxt.bean.Emp");//创建属性CtField f1 = CtField.make("private int empno;", cc);CtField f2 = CtField.make("private String ename;", cc);cc.addField(f1);cc.addField(f2);//创建方法CtMethod m1 = CtMethod.make("public int getEmpno(){return empno;}", cc);CtMethod m2 = CtMethod.make("public void setEmpno(int empno){this.empno=empno;}", cc);cc.addMethod(m1);cc.addMethod(m2);//添加构造器CtConstructor constructor = new CtConstructor(new CtClass[]{CtClass.intType,pool.get("java.lang.String")}, cc);constructor.setBody("{this.empno=empno; this.ename=ename;}");cc.addConstructor(constructor);cc.writeFile("c:/myjava"); //将上面构造好的类写入到c:/myjava中System.out.println("生成类,成功!");}
}
/*** 测试javassist的API**/
class Demo02 {/*** 处理类的基本用法* @throws Exception*/public static void test01() throws Exception{ClassPool pool = ClassPool.getDefault();CtClass cc = pool.get("com.bjsxt.test.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.bjsxt.test.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("com.bjsxt.test.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("com.bjsxt.test.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.getter("setSalary", f1));;}/*** 构造方法的操作* @throws Exception*/public static void test05() throws Exception {ClassPool pool = ClassPool.getDefault();CtClass cc = pool.get("com.bjsxt.test.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.bjsxt.test.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();}
}

使用javassist相关推荐

  1. javassist 初步学习

    javassist简介 javassist可以对一个已经编译好了的.class文件的字节码进行改动,比如说我可以为一个类添加一个方法,添加一个属性,也可以修改一个方法等,还可以对一个方法,异常进行拦截 ...

  2. javassist学习笔记

    2019独角兽企业重金招聘Python工程师标准>>> 介绍:www.javassist.org/ javassist.ASM 对比 1.javassist是基于源码级别的API比基 ...

  3. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  4. No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法

    No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer解决方法 参考文章: ...

  5. 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...

  6. 【转载】使用javassist动态注入代码

    关于java字节码的处理,目前有很多工具,如bcel,asm.不过这些都需要直接跟虚拟机指令打交道.如果你不想了解虚拟机指令,可以采用javassist.javassist是jboss的一个子项目,其 ...

  7. Java 编程的动态性,第 6 部分: 利用 Javassist 进行面向方面的更改--转载

    本系列的 第 4 部分和 第 5 部分讨论了如何用 Javassist 对二进制类进行局部更改.这次您将学习以一种更强大的方式使用该框架,从而充分利用 Javassist 对在字节码中查找所有特定方法 ...

  8. Java 编程的动态性, 第4部分: 用 Javassist 进行类转换--转载

    讲过了 Java 类格式和利用反射进行的运行时访问后,本系列到了进入更高级主题的时候了.本月我将开始本系列的第二部分,在这里 Java 类信息只不过是由应用程序操纵的另一种形式的数据结构而已.我将这个 ...

  9. APM - Javassist 入门 生成一个简单类

    文章目录 官网 概述 Javassist作用 常用API Javassist 语法 Javassist使用流程 Demo Demo2 注意事项 参考 官网 http://www.javassist.o ...

  10. Java学习之javassist

    javassist可以实现动态编程,即动态生成class文件,或者操作class文件,下面就详细介绍. 1.读取和输出字节码 1 ClassPool pool = ClassPool.getDefau ...

最新文章

  1. Verilog HDL 使用规范(一)
  2. Twitter-Snowflake,64位自增ID算法详解
  3. shell 常用命令
  4. SAP MES(manufacturing execution system)介绍
  5. DDNS For RHEL5
  6. [POI2015] Pustynia(差分约数,线段树优化建图,拓扑)
  7. TensorFlow 简介
  8. 平面束方程少一个面的原因
  9. onenote2016下载地址
  10. 《股票大作手操盘术》读书笔记
  11. 【渗透测试笔记】之【钓鱼姿势——exe捆绑与免杀】
  12. pandas——显示设置
  13. 【旋转摆正验证码】知苗易约小程序旋转摆正验证码识别——识别解绝方法
  14. ubuntu 18.04-设置合上笔记本盖子不休眠
  15. HTML5接入百度地图并搜索定位
  16. Debian 7.4 下mentohust开机自动认证
  17. 什么是 Web 3.0?定义、功能和示例
  18. 挑灯夜读——Java(一):类与对象
  19. 关于CFT, FT, DTFT, DFS, DFT 的推导与解释
  20. ubuntu16.04+惠普光影精灵+GTX960M+英伟达驱动安装

热门文章

  1. VS2010 SP1安装卡在VS10Sp1-KB983509处的解决
  2. ProCAD.2D/3D.Designer.v2008.1 1CD(最大程度地提高管道设计效率)\
  3. JavaScript 开发者的 5 款必备工具
  4. CS:APP配套实验文件下载方法
  5. linux系统鼠标主题下载,Ubuntu Linux鼠标主题:AlkanoMB
  6. 嵌入式linux中文语言支持,嵌入式linux无法显示中文问题
  7. 如何在命令提示符窗口下运行Win32控制台应用程序
  8. 国内外各大免费搜索引擎、导航网址提交入口
  9. 全民营销,只看这篇文章就够了
  10. 企业常用OSPF组网配置示例