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. 20145122 《Java程序设计》课程总结

    课程总结 每周读书笔记链接汇总 第一周读书笔记:http://www.cnblogs.com/20145122chengzhiyin/p/5244949.html 第二周读书笔记:http://www ...

  2. 20145322 Exp5 利用nmap扫描

    20145322 Exp5 利用nmap扫描 实验过程 使用命令创建一个msf所需的数据库 service postgresql start msfdb start 使用命令msfconsole开启m ...

  3. vijos 1098 合唱队形 - 动态规划

    描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...

  4. LTE-A 载波聚合(Carrier Aggregation)介绍【转】

    本文转自:https://blog.csdn.net/txgc1009/article/details/46467255 载波聚合(Carrier Aggregation) 首先介绍几个基本概念 Pr ...

  5. 【第十六章】 springboot + OKhttp + String.format

    模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...

  6. C# 查出数据表DataTable 清除一列中的重复项保留其他项

    http://bbs.csdn.net/topics/391085792     DataTable 老表= 新表.AsEnumerable().GroupBy(p => p["姓名& ...

  7. 论文笔记——PRUNING FILTERS FOR EFFICIENT CONVNETS

    论文地址:https://arxiv.org/abs/1608.08710 主要思想 这篇文章主要讲了对filters的裁剪,裁剪方法是计算L1范数,然后裁剪掉较少的,多少取决于加速比. 实现效果 V ...

  8. java的基本数据类型默认值

    这里就举int类型 默认值在类实例化,也就是对象中才有默认值0,或者是静态变量. 1.先看局部变量使用(不行,报错) 2.静态变量 3.类非静态属性

  9. Linux(CentOS 6.5) 下安装MySql 5.7.18 二进制版本粗浅攻略

    鉴于Linux和mysql因不同版本,安装方式也不同,所以在阅读本攻略前,请确保各位同学的版本和我的Linux.MySql 版本一致. 如果不一致,只能参考. 我的版本: Linux CentOS 6 ...

  10. LINK : fatal error LNK1104: 无法打开文件“libboost_serialization-vc90-mt-gd-1_62.lib”

    boost安装:https://www.cnblogs.com/sea-stream/p/10205425.html 在vs中添加