Java 编程的动态性,第 1 部分: 类和类装入
这一有关 Java 编程动态方面的新的系列文章研究了执行 Java 应用程序时幕后所发生的事情。企业 Java专家
Dennis Sosnoski 提供了 Java 二进制类格式以及在 JVM
内部类所发生的情况的内幕。接着,他将讨论类装入问题,其范围涉及从运行简单的 Java 应用程序所需的类的数量到可能造成 J2EE
及类似的复杂体系结构出现问题的类装入器冲突。
本文是这个新系列文章的第一篇,该系列文章将讨论我称之为
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 0
相关文档:
谜题56:大问题 | 谜题57:名字里有什么? | 谜题58:产生它的散列码 | 谜题59:什么是差? | 谜题60:一行的方法 | 谜题61:日期游戏 | 谜题62:名字游戏 |
谜题63:更多同样的问题 | 谜题64:按余数编组 | 谜题6 ......
哈哈,今天没事做,但心情不错,所以写这篇文章.
类装载器是Java程序运行时不可缺少的一部分,它的任务是把由Java源程序编译成的class文件读入到内存中,确切的说是装入到JVM的内存中,应为JVM是一台抽象的计算机,它有着自己的CPU,内存等. 在class文件中包含了一个类的各种信息,当执行java XXX命 ......
Socket传输模式
Sockets有两种主要的操作方式:面向连接的和无连接的.面向连接的sockets操作就像一部电话,他们必须建立一个连接和一人呼叫.所有的事情在到达时的顺序和他们出发时的顺序时相同.无连接的sockets操作就像是个邮件投递,,没有什么确保,多个邮件可能在到达时的顺序和出发时的顺序不相同.
到底用哪种模式是邮应 ......
java.applet 提供创建Applet的类以及用于Applet和Applet上下文(Applet Context)通信的类。
java.awt 包含所有创建用户接口(界面)、绘制图像的类。
java.awt.color 提供颜色空间的类
java.awt.datatransfer 提供应用内和应用间传输数据的接口和类。
java.awt.dnd 拖拽功能支持类库(拖拽是在许多GUI提供的一种在两个 ......
1、利用System.getProperty()函数获取当前路径:
System.out.println(System.getProperty("user.dir"));//user.dir指定了当前的路径
2、使用File提供的函数获取当前路径:
File directory = new File("");//设定为当前文件夹
try{
System.out.println(directory.get ......