Javassist 读写字节码

Javassist 是一个用于处理Java字节码的库。Java 字节码以二进制的形式存储在 class 文件中。每个 class 文件包含一个 Java 类或接口。

class 文件可以用 Javassist.CtClass 类来表示。CtClass对象用于处理 class 文件。以下是一个简单的例子,有两个类,这两个类没有关系,我们修改 Rectangle 使他的父类编程  Point。

ClassPool pool = ClassPool.getDefault();	
CtClass cc = pool.get("com.democome.Rectangle");	
cc.setSuperclass(pool.get("com.democome.Point"));	
cc.writeFile();

Rectangle.java

public class Rectangle {	
    private int width;	
    private int height;	
}

Point.java

public class Point {	
}

运行之后,用反编译工具可以看一下,继承关系已经改变:

640?wx_fmt=png

上面的代码首先获得一个 ClassPool。ClassPool 是 CtClass 的容器。它读取 class 文件来构造 CtClass 对象,并记录。要修改 calss,首先要从 ClassPool 通过 get( ) 获取一个 CtClass 对象。

关于实现的原理 ClassPool 中有一个 Hashtable 来存储 CtClass,key 就是类名。ClassPool 的 get( ) 方法如果能找到这个类则直接返回,否则创建一个 CtClass 对象返回,并存到 Hashtable 中。

privateHashtablecflow=null;

CtClass 对象对 class 文件进行修改,并调用 writeFile( ) 写入文件。Javassist 还提供了一种直接获取修改后的字节码的方法ÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值