javassist的作用是动态生成字节码。

package com.zhang;
class Fighter {} public class Assist_Test {
public static void main_modify(String[] args) throws NotFoundException,
CannotCompileException, IOException {
//修改已有类,添加name字段。前提是该类没有被加载
ClassPool pool = ClassPool.getDefault();
//CtClass (compile-time class)
CtClass cc = pool.get("com.zhang.Fighter");
cc.addField(new CtField(pool.get("java.lang.String"), "name", cc));
//生成class文件
//translates the CtClass object into a class file and writes it on a local disk
cc.writeFile();
} public static void main(String[] args) throws CannotCompileException, NotFoundException, InstantiationException, IllegalAccessException, ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
// 创建类
ClassPool pool = ClassPool.getDefault();
CtClass cls = pool.makeClass("com.zhang.Player"); // 添加私有成员name及其getter、setter方法
CtField nameField = new CtField(pool.get("java.lang.String"), "name", cls);
nameField.setModifiers(Modifier.PRIVATE);
cls.addField(nameField, Initializer.constant(""));
cls.addMethod(CtNewMethod.setter("setName", nameField));
cls.addMethod(CtNewMethod.getter("getName", nameField)); // 添加无参的构造体
CtConstructor cons = new CtConstructor(new CtClass[] {}, cls);
cons.setBody("{name = \"default\";}");
cls.addConstructor(cons); // 添加有参的构造体
cons = new CtConstructor(new CtClass[] {pool.get("java.lang.String")}, cls);
cons.setBody("{$0.name = $1;}");
cls.addConstructor(cons); // 打印创建类的类名
Class playerClass = cls.toClass();
System.out.println(playerClass); // 通过反射创建无参的实例,并调用getName方法
Object obj = Class.forName("com.zhang.Player").newInstance();
Method getter = obj.getClass().getMethod("getName");
System.out.println(getter.invoke(obj)); // 调用其setName方法
Method setter = obj.getClass().getMethod("setName", new Class[] {String.class});
setter.invoke(obj, "zhang");
System.out.println(getter.invoke(obj)); // 通过反射创建有参的实例,并调用getName方法
obj = Class.forName("com.zhang.Player").getConstructor(String.class).newInstance("nobody");
getter = obj.getClass().getMethod("getName");
System.out.println(getter.invoke(obj));
} }

dubbo中的JavassistCompiler和JavassistProxyFactory使用了javassist包生成class文件。

javassist示例的更多相关文章

  1. Javassist字节码增强示例

    概述 Javassist是一款字节码编辑工具,可以直接编辑和生成Java生成的字节码,以达到对.class文件进行动态修改的效果.熟练使用这套工具,可以让Java编程更接近与动态语言编程. 下面一个方 ...

  2. 分布式服务框架 dubbo/dubbox 入门示例

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

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

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

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

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

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

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

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

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

  7. Java学习之javassist

    1.读取和输出字节码 ClassPool pool = ClassPool.getDefault(); //会从classpath中查询该类 CtClass cc = pool.get("t ...

  8. 分布式服务框架 dubbo/dubbox 入门示例(转)

    dubbo是一个分布式的服务架构,可直接用于生产环境作为SOA服务框架. 官网首页:http://dubbo.io/ ,官方用户指南 http://dubbo.io/User+Guide-zh.htm ...

  9. Javassist进行方法插桩

    javassist官网 http://jboss-javassist.github.io/javassist/ javassist API网 http://jboss-javassist.github ...

随机推荐

  1. JavaScript 表单验证 案例

    JavaScript 表单验证 案例 版权声明:未经授权,严禁转载!   编写 HTML 文件,搭建主体界面 <html> <head> <meta charset=&q ...

  2. Android实验一(在Android Studio中创建项目和模拟器)

    北京电子科技学院(BESTI) 实     验    报     告 课程:移动平台开发         班级:1592 姓名:苏泽楠 学号:20159207 成绩:             指导教师 ...

  3. win7 + MySQL 5.6.35 免安装版部署

    之前项目开发一直用的asp.net技术,所以数据库自然而然的就用的Sql Server了,最近想着手看一下MySQL数据库,部署免安装版的MySQL的过程记录一下. 准备工作:window 7   6 ...

  4. 【转】各种消息下wParam及lParam值的含义

    转载自:http://bbs.fishc.com/forum.php?mod=viewthread&tid=52668#lastpost 01.WM_PAINT消息 LOWORD(lParam ...

  5. Oracle 存储过程入门(一)

    一,基本入门介绍 公司系统需要用到oracle,可是还没在项目用过oracle,好吧,从基本学起.有问题的地方,欢迎指导啊. 看创建存储过程的基本定义.注意,带有[]的都是可选的,可有可无的.只是语法 ...

  6. Several Service Control Manager Issues (Event ID's 7000, 7009, 7011)

    https://answers.microsoft.com/en-us/windows/forum/windows_7-performance/several-service-control-mana ...

  7. Ubuntu 14.04 python3.6 安装

    参考 how-do-i-install-python-3-6-using-apt-get Ubuntu 14.04 python3.6 安装 sudo add-apt-repository ppa:j ...

  8. 关于在iBatis中配置Oracle以及MySQL 自增字段

    <insert id="insertPerson" parameterClass="person"> <!-- MySQL数据库自增字段的控制 ...

  9. MySQL会创建临时表的几种情况

    1.UNION查询: 2.用到TEMPTABLE算法或者是UNION查询中的视图: 3.ORDER BY和GROUP BY的子句不一样时: 4.表连接中,ORDER BY的列不是驱动表中的:(指定了联 ...

  10. ros 安装c++编译的可执行文件

    xxx为c++源文件名 install( TARGETS xxx ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTI ...