本文是Javassist之内省与定制(一)的续文,需要看完上篇文章之后才能阅读,请先阅读上个章节。
$args
变量 $args
是表示所有参数的数组。是一个Object类型的数组。如果参数的类型是如int一样的基本类型,参数值将会自动转换为包装类。因此, $args[0]
等同于$1
,除非第一个参数是基本类型。
本文是Javassist之内省与定制(一)的续文,需要看完上篇文章之后才能阅读,请先阅读上个章节。
变量 $args
是表示所有参数的数组。是一个Object类型的数组。如果参数的类型是如int一样的基本类型,参数值将会自动转换为包装类。因此, $args[0]
等同于$1
,除非第一个参数是基本类型。
CtClass提供了内省的方法。Javassist的内省机制兼容Java的反射API。CtClass提供了getName(),getSuperclass(),getMethods()等等方法。CtClass也提供了修改类定义的方法。它允许添加新的成员变量,构造函数,以及方法。操作方法体也是可以的。
在Javassist之Classloader(一)中我们讲述了Javassist的toClass()以及Java的类加载器,本次我们将介绍Javassist的加载器,以及自定义加载器。
Javassist提供了一个javassist.loader类加载器。这个类加载器使用一个javassist.ClassPool对象来读取类文件。
如果需要修改的类是预先知道的,最简单的修改方式如下:
如果在加载时不确定类是否已被修改,用户一定要配合Classloader来使用Javassist。
ClassPool对象是CtClass对象集合的容器。一旦CtClass对象被创建,它就会被永远一直记录在ClassPool内。这是因为当编译器编译这个CtClass表示的类源代码之后,可能需要访问这个CtClass。
例如,假设一个新的getter()方法被添加到一个表示Point类的CtClass对象中。然后程序尝试编译调用Point中的getter()方法的源代码,并且用编译过的代码作为方法体,并添加到另一个Line类中。
Javassist是一个用于处理Java字节码的类库。Java字节码是一个以二进制文件进行存储的class文件。每一个class文件都包含一个Javal类或者是接口。
Javassist.Ctclass是一个对class文件的一个抽象表示形式。一个CtClass(编译时类)对象是一个处理class文件的句柄。