分类 java 中的文章

Javassist入门之其他特性

泛型

Javassist 的低级别 API 完全支持 Java 5 引入的泛型。但是,高级别的API(如CtClass)不直接支持泛型。

Java 的泛型是通过擦除技术实现。 编译后,所有类型参数都将被删除。 例如,假设您的源代码声明一个参数化类型 Vector

……

阅读全文

Javassist入门之ClassPool简介

ClassPool对象是CtClass对象的容器。 一旦创建了一个CtClass对象,它将被记录在ClassPool中,这是因为编译器当编译由该ClassPool对象引用的源代码时,可能稍后需要访问该ClassPool对象。

例如,假设一个新方法getter()被添加到表示Point类的CtClass对象中。之后,该程序尝试编译源代码,包括在Point中的getter()方法调用,并使用编译的代码作为方法的主体,这将被添加到另一个类Line。如果表示Point的CtClass对象丢失,则编译器无法编译getter()方法调用。请注意,原始类定义不包括getter()。因此,为了正确编译这种方法调用,ClassPool必须在程序执行时包含CtClass的所有实例。

……

阅读全文

Javassist入门之字节码接口

Javassist 还提供了用于直接编辑类文件的低级级 API。 使用此 API之前,你需要详细了解Java 字节码和类文件格式,因为它允许你对类文件进行任意修改。

如果你只想生成一个简单的类文件,使用javassist.bytecode.ClassFileWriter就足够了。 它比javassist.bytecode.ClassFile更快而且更小。

……

阅读全文

Javassist入门之类加载器

如果提前知道哪些类必须修改,那么修改类的最简单的方法如下:

  1. 通过调用ClassPool.get()获取一个CtClass对象,
  2. 修改它
  3. 在该CtClass对象上调用writeFile()或toBytecode()来获取修改的类文件。

如果在加载时才能确定一个类是否被修改,用户必须使Javassist与类加载器协作。Javassist可以与类加载器一起使用,以便在加载时可以修改字节码。 Javassist的用户可以定义自己的类加载器版本,但也可以使用Javassist提供的类加载器。

……

阅读全文

Javassist入门之自我检查和定制

CtClass提供了自我检查的方法。Javassist的自我检查的能力与Java反射API兼容。CtClass提供了getName(),getSuperclass(),getMethods()等等。CtClass还提供了修改类定义的方法。它允许添加一个新的字段,构造函数和方法。构造方法体也是可能的。

方法由CtMethod对象表示。CtMethod提供了几种修改方法定义的方法。请注意,如果方法是从超类继承的,那么表示继承方法的相同CtMethod对象代表在该超级类中声明的方法。CtMethod对象对应于每个方法声明。

……

阅读全文

Javassist入门之读写字节码

Javassist是处理Java字节码的类库,Java字节码存储在称为class文件的二进制文件中,每个class文件都包含一个Java类或接口。
类Javassist.CtClass是class文件的抽象表示,一个CtClass(编译时类)对象是处理class文件的句柄。以下程序是一个非常简单的例子:

……

阅读全文

泛型

泛型

泛型是类型参数化的泛型类或接口。下面将修改Box类来演示这个概念。

……

阅读全文

监视器 - Java同步的基本思想

如果您在大学时进行了操作系统课程,您可能会记得,监视器是操作系统中同步的重要概念。它也用于Java同步。这个帖子用类比来解释“监视”的基本思想。

……

阅读全文

为什么使用泛型

为什么使用泛型

简言之,在定义类,接口或是方法的时候泛型能够使类型(类和接口)成为参数。跟我们熟悉的方法中定义的形参很相似,类型参数提供了一种方式让你在面对不同输入的时候能够重用同一份代码。不同的是形参传入的是值,但是类型参数传入的是类型。

使用泛型代码比非泛型代码有许多好处:

- 在编译时期更强的类型校验

……

阅读全文