欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

javassist简介 JVM数据结构CC++C# 

程序员文章站 2024-03-14 16:22:40
...

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

public class Hello {
 public void say() {
  System.out.println("hello");
 }
}

import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;

public class Test {
    public static void main(String args[]) throws Exception {

        ClassPool cp = ClassPool.getDefault();

        CtClass cc = cp.get("test.javassist.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 的实例表示。这些类定义了修改由它们所表示的对象的所有方法的方法,包括方法或者构造函数中的实际字节码内容