ITEEDU

第12章 简化发布处理:自动JAR文件创建

  在这一章里,我们将从servlet的编程中先停下来,看一看怎样能够使你的applet的分布处理更加容易。对一个applet进行发布处理的最艰难的一步,不仅仅是正确的封装成为一个压缩的ZIP文件或者JAR文件,而是开发一个类文件从属关系的检验程序和把任何从属关系加入到一个ZIP或者JAR文件之中的问题。

12.1 找到类文件从属关系

  要找到一个给定类文件的所有从属关系,我们确实需要检查由Java虚拟机所定义的内部类结构。Java虚拟机规范描述了如下的一个类文件:一个8位的字节流。所有的16位,32位和64位数分别由读入两个,四个和八个连接的8位字节来构造。多字节的数据条目总是按照尾部先存的顺序来存储,也就是说后面的字节先存储。正如我们所要看到的,所有的类引用都保存在类文件之中,而我们所要做的全部事情就是找到它们。表12.1显示了我们所要考察的最基本的类文件结构。
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
    条目     长度
  ─────────────────────────────────
  幻数(Magic)           4
  次版本(Minor version)      2
  主版本(Majorversion)       2
  常量池计数(Constant pool count) 2
  常量池(Constant pool)     可变长
  访问标志(Access flags)     2
  当前类(This class)        2
  父类(Super class)        2
  接口计数(Interfaces count)   2
  接口(Interfaces)      2*Interface count
  域计数(Field count)     2
  域(Fields)          可变长
  方法计数(Method count)    2
  方法(Methods)        可变长
  属性计数(Attribute count)  2
  属性(Attributes)      可变长
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

12.1.1 进一步考察类文件结构

  现在让我们来进一步考察类文件结构中的每一个条目。一旦我们理解了这些结构是怎样配合起来的,就会很容易地遍历该结构并且找出有价值的信息。

  幻数(Magic)
  这个条目包含了一个所有的Java类文件都通用的幻数。这个幻数的值总是0xCAFEBASE(十六进制)

  次版本和主版本(Minor Version 和 Major Version)
  次版本和主版本条目的取值是创建类文件的编译器的次版本号和主版本号。例如Sun的JDK的1.0.2版本和1.1版本,次版本号就是3,主版本号就是45。唯有Sun公司才能定义新版本号的意义。

  常量池计数(Constant Pool Count)
  常量池计数的计数值必须要大于零,它定义了常量池表的表项的数目。请注意常量池计数包括了常量池表项在0值的索引,但是表项并不包括在类文件中并且被保留下来为Java虚拟机内部使用。

  常量池(Constant Pool)
  常量池是一个表项数变长的表。从索引值1直到常量池计数的每一个表项都是可变长的变量。每个表项的格式由一个打头的标记字节所定义,正如表12.2所示。

           表12.2 常量池标记数值
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  常量类型           值
  ─────────────────────────────────
  CONSTANT_Utf8         1
  CONSTANT_Integer       3
  CONSTANT_Float        4
  CONSTANT_Long         5
  CONSTANT_Double        6
  CONSTANT_Class        7
  CONSTANT_String        8
  CONSTANT_Fieldref       9
  CONSTANT_Methodref      10
  CONSTANT_InterfaceMethodref 11
  CONSTANT_NameAndType     12
  ─────────────────────────────────

  CONSTANT_Utf8
  CONSTANT_Utf8表项代表了一个常量字符串值。Uft8字符串是被编码的,这样一来,只包含非空的ASCII字符的字符序列可以只用每个字符一个字节来表示。16位的字符也可以表示。表12.3显示了CONSTANT_Utf8表项的结构。

          表12.3 CONSTANT_Utf8表项
  ━