Javassist学习1:简介

来源:互联网 发布:云优化搜推宝排名大师 编辑:程序博客网 时间:2024/06/02 04:10

       Javassist是一个执行字节码操作的强而有力的驱动代码库。它允许开发者自由的在一个已经编译好的类中添加新的方法,或者是修改已有的方法。但是,和其他的类似库不同的是,Javassist并不要求开发者对字节码方面具有多么深入的了解,同样的,它也允许开发者忽略被修改的类本身的细节和结构。

 

       字节码驱动通常被用来执行对于已经编译好的类的修改,或者由程序自动创建执行类等等等等相关方面的操作。这就要求字节码引擎具备无论是在运行时或是编译时都能修改程序的能力。当下有些技术便是使用字节码来强化已经存在的Java类的,也有的则是使用它来使用或者产生一些由系统在运行时动态创建的类。举例而言

 

       但是,尽管如此,编写字节码对于框架程序开发者们而言,却是一个相当不受欢迎的繁重任务。学习和使用字节码在某种程度上就如同使用汇编语言。这使得于大多数开发者而言,尽管在程序上可以获得相当多的好处,可攀登它所需要的难度则足以冷却这份热情。不仅如此,在程序中使用字节码操作也大大的降低了程序的可读性和可维护性。

 

       Javassist是一个可以执行字节码操作的函数库,可是尽管如此,它却是简单而便与理解的。他允许开发者对自己的程序自由的执行字节码层的操作,当然了,你并不需要对字节码有多深的了解,或者,你根本就不需要了解。

 

       Javassist的最外层的APIJAVA的反射包中的API颇为类似。它使你可以在装入ClassLoder之前,方便的查看类的结构。它主要由CtClass,CtMethod,,以及CtField几个类组成。用以执行和JDK反射APIjava.lang.Class,java.lang.reflect.Method, java.lang.reflect.Method .Field相同的操作。这些类可以使你在目标类被加载前,轻松的获得它的结构,函数,以及属性。此外,不仅仅是在功能上,甚至在结构上,这些类的执行函数也和反射的API大体相同。比如getNamegetSuperclassgetMethods,getSignature,等等。如果你对JAVA的反射机制有所了解的话,使用Javassist的这一层将会是轻松而快乐的。

        接下来我们将给出一个使用Javassist来读取org.geometry.Point.class的相关信息的例子(当然了,千万不要忘记引入javassist.*包):

ClassPool pool = ClassPool.getDefault();CtClass pt =pool.get("org.geometry.Point");System.out.println(pt.getSuperclass().getName()); 

       其中,ClassPoolCtClass 的创建工厂。它在class path中查找CtClass的位置,并为每一个分析请求创建一个CtClass实例。而“getSuperclass().getName()”则展示出org.geometry.Point.class所继承的父类的名字。

 

       刚刚举了一个小DEMO,应该对javassist工具包有一定了解,下篇博客介绍javassist工具包一个更加全面的使用以及它的应用场景,以及介绍一下我在产品中是怎么使用它并解决一些问题的。


0 0