Javassist之内省与定制(二)

本文是Javassist之内省与定制(一)的续文,需要看完上篇文章之后才能阅读,请先阅读上个章节。

$args

变量 $args 是表示所有参数的数组。是一个Object类型的数组。如果参数的类型是如int一样的基本类型,参数值将会自动转换为包装类。因此, $args[0] 等同于$1,除非第一个参数是基本类型。

阅读全文 »

Javassist之内省与定制(一)

CtClass提供了内省的方法。Javassist的内省机制兼容Java的反射API。CtClass提供了getName(),getSuperclass(),getMethods()等等方法。CtClass也提供了修改类定义的方法。它允许添加新的成员变量,构造函数,以及方法。操作方法体也是可以的。

阅读全文 »

Javassist之其它特性

范型

Javassist的低级API支持完全的Java5引入的范型。另一方面,高级API例如CtClass无法直接支持范型。然而,这对字节码修改来说不是个紧要的问题。

Java的范型技术是通过擦除技术实现的。

阅读全文 »

Javassist之Classloader(二)

Javassist之Classloader(一)中我们讲述了Javassist的toClass()以及Java的类加载器,本次我们将介绍Javassist的加载器,以及自定义加载器。

1. 使用javassist.Loader

Javassist提供了一个javassist.loader类加载器。这个类加载器使用一个javassist.ClassPool对象来读取类文件。

阅读全文 »

Javassist之Classloader(一)

如果需要修改的类是预先知道的,最简单的修改方式如下:

  1. 调用ClassPool.get()获取CtClass对象
  2. 修改
  3. 调用CtClass对象的writeFile()或者toBytecode()来获取已修改的类文件

如果在加载时不确定类是否已被修改,用户一定要配合Classloader来使用Javassist。

阅读全文 »

Javassist之ClassPool

ClassPool对象是CtClass对象集合的容器。一旦CtClass对象被创建,它就会被永远一直记录在ClassPool内。这是因为当编译器编译这个CtClass表示的类源代码之后,可能需要访问这个CtClass。

例如,假设一个新的getter()方法被添加到一个表示Point类的CtClass对象中。然后程序尝试编译调用Point中的getter()方法的源代码,并且用编译过的代码作为方法体,并添加到另一个Line类中。

阅读全文 »

Javassist之字节码读写

Javassist是一个用于处理Java字节码的类库。Java字节码是一个以二进制文件进行存储的class文件。每一个class文件都包含一个Javal类或者是接口。

Javassist.Ctclass是一个对class文件的一个抽象表示形式。一个CtClass(编译时类)对象是一个处理class文件的句柄。

阅读全文 »