我的第一个javassist

javassist可以对一个已经编译好了的.class文件的字节码进行改动,比如说我可以为一个类添加一个方法,添加一个属性,也可以修改一个方法等,还可以对一个方法,异常进行拦截等。
javassist的最外层的API和JAVA的反射包中的API颇为类似。它使你可以在装入ClassLoder之前,方便的查看类的结构。它主要由CtClass,,CtMethod,,以及CtField几个类组成。
这是网上的一个例子。它修改了Hello类里say方法。
public class Hello {
 public void say() {
  System.out.println("hello");
 }
}

public class Test {

 public static void main(String args[]) throws Exception{
  ClassPool cp = ClassPool.getDefault();
  CtClass cc = cp.get("com.hundsun.ares.liuji.myfirst.Hello");
  CtMethod m = cc.getDeclaredMethod("say");
  m.setBody("{System.out.println(\"shit\");}");
  m.insertBefore("System.out.println(\"fuck\");");
  m.insertAfter("System.out.println(\"method over\");");
  Class c = cc.toClass();
  Hello h = (Hello)c.newInstance();
  h.say();
 }
}

运行结果:
fuck
shit
method over
从结果我们可以看出,hello类里的say()方法已经被修改。
现在我们在来分析各个类的作用
ClassPool 类跟踪和控制所操作的类,它读取.class文件。这个类的工作方式与 JVM 类装载器非常相似,但是有一个重要的区别是它不是将装载的、要执行的类作为应用程序的一部分链接,类池使所装载的类可以通过 Javassist API 作为数据使用,
CtClass 装载到类池中的类,标准的 Java java.lang.Class 类一样, CtClass 提供了检查类数据(如字段和方法)的方法。不过,这只是 CtClass 的部分内容,它还定义了在类中添加新字段、方法和构造函数、以及改变类、父类和接口的方法。奇怪的是,Javassist 没有提供删除一个类中字段、方法或者构造函数的任何方法
字段、方法和构造函数分别由 javassist.CtField javassist.CtMethod javassist.CtConstructor 的实例表示。这些类定义了修改由它们所表示的对象的所有方法的方法,包括方法或者构造函数中的实际字节码内容

转载于:https://www.cnblogs.com/javaloves/archive/2009/07/30/1535439.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值