快速业务通道

Java编程的动态性,第1部分: 类和类装入 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17

Java编程的动态性,第1部分: 类和类装入

时间:2011-04-09 IBM Dennis M. Sosnoski

本文是这个新系列文章的第一篇,该系列文章将讨论我称之为 Java 编程的动态性的一系 列主题。这些主题的范围从 Java 二进制类文件格式的基本结构,以及使用反射进行运行时 元数据访问,一直到在运行时修改和构造新类。贯穿整篇文章的公共线索是这样一种思想: 在 Java 平台上编程要比使用直接编译成本机代码的语言更具动态性。如果您理解了这些动 态方面,就可以使用 Java 编程完成那些在任何其它主流编程语言中不能完成的事情。

本文中,我将讨论一些基本概念,它们是这些 Java 平台动态特性的基础。这些概念的核 心是用于表示 Java 类的二进制格式,包括这些类装入到 JVM 时所发生的情况。本文不仅是 本系列其余几篇文章的基础,而且还演示了开发人员在使用 Java 平台时碰到的一些非常实 际的问题。

用二进制表示的类

使用 Java 语言的开发人员在用编译器编译他们的源代码时,通常不必关心对这些源代码 做了些什么这样的细节。但是本系列文章中,我将讨论从源代码到执行程序所涉及的许多幕 后细节,因此我将首先探讨由编译器生成的二进制类。

二进制类格式实际上是由 JVM 规范定义的。通常这些类表示是由编译器从 Java 语言源 代码生成的,而且它们通常存储在扩展名为 .class 的文件中。但是,这些特性都无关紧要 。已经开发了可以使用 Java 二进制类格式的其它一些编程语言,而且出于某些目的,还构 建了新的类表示,并被立即装入到运行中的 JVM。就 JVM 而言,重要的部分不是源代码以及 如何存储源代码,而是格式本身。

那么这个类格式实际看上去是什么样呢?清单 1 提供了一个(非常)简短的类的源代码 ,还附带了由编译器输出的类文件的部分十六进制显示:

清单 1. Hello.java 的源代码和(部分)二进制类文件

public class Hello {    public static void main(String[] args) {      System.out.println("Hello, World!");    } } 0000: cafe babe 0000 002e 001a 0a00 0600 0c09 ................ 0010: 000d 000e 0800 0f0a 0010 0011 0700 1207 ................ 0020: 0013 0100 063c 696e 6974 3e01 0003 2829 .....<init>...() 0030: 5601 0004 436f 6465 0100 046d 6169 6e01 V...Code...main. 0040: 0016 285b 4c6a 6176 612f 6c61 6e67 2f53 ..([Ljava/lang/S 0050: 7472 696e 673b 2956 0c00 0700 0807 0014 tring;)V........ 0060: 0c00 1500 1601 000d 4865 6c6c 6f2c 2057 ........Hello, W 0070: 6f72 6c64 2107 0017 0c00 1800 1901 0005 orld!........... 0080: 4865 6c6c 6f01 0010 6a61 7661 2f6c 616e Hello...java/lan 0090: 672f 4f62 6a65 6374 0100 106a 6176 612f g/Object...java/ 00a0: 6c61 6e67 2f53 7973 7465 6d01 0003 6f75 lang/System...ou ...

二进制类文件的内幕

清单 1 显示的二进制类表示中首先是“cafe babe”特征符,它标识 Java 二进制类格式 (并顺便作为一个永久的 ― 但在很大程度上未被认识到的 ― 礼物送给努力工作的 barista,他们本着开发人员所具备的精神构建 Java 平台)。这个特征符恰好是一种验证一 个数据块 确实声明成 Java 类格式的一个实例的简单方法。任何 Java 二进制类(甚至是文 件系统中没有出现的类)都需要以这四个字节作为开始。

该数据的其余部分不太吸引人。该特征符之后是一对类格式版本号(本例中,是由 1.4.1 javac 生成的次版本 0 和主版本 46 ― 用十六进制表示就是 0x2e),接着是常量池中项的 总数。项总数(本例中,是 26,或 0x001a)后面是实际的常量池数据。这里放着类定义所 用的所有常量。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号