在 这 一 讲 中, 我 们 将 重 点 介 绍Java 平 台 技 术, 首 先 介 绍Java 核 心 技 术Java 虚 拟 机 的 概 貌、 结 构, 然 后 再 说 明100 % 纯Java 的 概 念 和 纯Java 程 序 应 遵 循 的 原 则, 在 本 讲 的 最 后, 我 们 将 介 绍 几 种 主 要 的Java 开 发 工 具 和 浏 览 工 具。
一、Java 虚 拟 机
上 一 讲 我 们 已 经 提 到 平 台 无 关 性 是Java 最 重 要 的 特 性, 而 实 现 这 一 特 性 的 基 础 就 是Java 虚 拟 机。 因 此, 了 解Java 虚 拟 机 的 结 构 和 工 作 方 式 对 进 一 步 理 解Java 概 念 十 分 有 益。 下 面 我 们 将 从 两 个 方 面 介 绍Java 虚 拟 机。
1、 什 么 是Java 虚 拟 机
可 以 说,Java 不 仅 仅 是 一 种 语 言, 更 重 要 是 一 种 区 别 于 传 统 系 统, 遵 循" 网 络 就 是 计 算 机" 信 条 的 平 台 技 术。Java 平 台 将 面 向 对 象 系 统 扩 展 成 包 括 程 序 和 数 据 的 网 络 计 算 机, 而 这 个 平 台 的 核 心 就 是Java 虚 拟 机, 许 多 使Java 成 为 万 能 开 发 平 台 的 属 性 都 源 于Java 虚 拟 机 的 概 念 和 实 现。
从 底 层 看,Java 虚 拟 机 就 是 以Java 字 节 码 为 指 令 组 的 软CPU。 附 图 显 示 了Java 系 统 流 程 图( 内 含Java 虚 拟 机)。 从 附 图 可 以 看 出, 在 服 务 器 端 首 先 由 开 发 人 员 编 写Java 程 序 并 存 为. Java 文 件; 其 次,Java 编 译 器 将.java 文 件 编 译 成 由 字 节 码 组 成 的.class 文 件; 最 后, 将.class 文 件 存 放 在Web 服 务 器 上。 到 此,Java 程 序 已 作 为Internet 或Intranet 资 源 存 放 在Web 服 务 器 上 随 时 可 让 客 户 使 用。 在 客 户 端, 用 户 使 用WWW 浏 览 器, 通 过Internet/Intranet 将Web 服 务 器 上 的 含 有Java 程 序 的 主 页 下 载, 再 依 赖 本 地Java 虚 拟 机 对.class 文 件 解 释 执 行。 这 样, 内 容 丰 富 的Java 应 用 资 源 便 由 服 务 器 传 送 到 客 户 端, 并 在 用 户 浏 览 器 上 显 示 出 来。
图1 Java 程 序 开 发 和 运 行 过 程
和 普 通 的 程 序 装 入 器 一 样,Java 虚 拟 机 执 行 程 序 时 首 先 从 网 络 或 本 地 存 储 器 中 装 入.class 文 件。 由 于 网 络 的 不 安 全 因 素 较 多,Hacker 的 恶 意 攻 击, 网 络 病 毒 的 侵 袭 等 等, 因 此,Java 虚 拟 机 在 执 行.class 文 件 前, 首 先 要 对 其 进 行 验 证。 如 果 没 有 通 过 验 证, 则 不 执 行 并 给 出 错 误 信 息, 相 反, 如 果 程 序 成 功 地 经 过 验 证 阶 段,Java 虚 拟 机 将 运 行 翻 译 器 读 取 字 节 码, 把 字 节 码 转 换 成 操 作 系 统 硬 件 相 关 的 指 令, 并 在 真 正 的CPU 上 执 行。
字 节 码 是Java 虚 拟 机 的 指 令 组( 很 象CPU 上 的 微 码)。 字 节 码 形 式 为< 操 作 码><... 操 作 数>。 其 中, 操 作 码 就 是 指 令 码, 占 一 个 字 节 的 长 度, 一 个 字 节 码 可 以 有 多 少 操 作 数。 目 前,Java 虚 拟 机 规 范 中 定 度 了220 个 字 节 码 指 令。 由 于 字 节 码 指 令 数 目 种 类 繁 多, 相 对 于 机 器 码 语 义 层 次 较 高, 因 此,Java 语 言 编 译 成 字 节 码 后 文 件 尺 寸 较 小 便 于 网 络 传 输。 为 了 运 行Java 字 节 码, 硬 件 厂 商 或 操 作 系 统 厂 商 在 自 己 的 硬 件 和 操 作 &I>
--------------------------------------------------------------------------------
Transfer interrupted!
cute; 合 中 实 现Java 虚 拟 机。Java 虚 拟 机 程 序 模 块 通 常 用C、C + + 或 相 应CPU 支 持 的 汇 编 语 言 编 写。Java 虚 拟 机 用 主 机 操 作 系 统 帮 助 完 成 内 存、 文 件 系 统、 显 示 器、 鼠 标、 键 盘、 网 络 和 其 它 设 备 驱 动 器 以 及 线 程 处 理 等。 另 外, 各 厂 商 开 发 自 己 系 统 的Java 虚 拟 机 需 要 获 得Java 许 可 证。 标 准 的Javasoft 许 可 包 括Java 类 库 和Java 虚 拟 机。 每 个 拿 到 许 可 证 的 公 司 都 会 在 自 己 的 平 台 上 成 为Java 的 监 护 人, 他 们 可 以 优 化 系 统 性 能, 但 必 须 保 证 独 立 于 平 台 的 纯Java 小 程 序 能 在 他 们 的 系 统 上 运 行。
从 概 念 上 讲,Java 虚 拟 机 的 基 本 执 行 单 元 是.class 文 件。 一 个Java 程 序 经 过 编 译 后 将 形 成 多 个.class 文 件, 而 每 个 文 件 都 对 应 一 个 程 序 中 定 义 的 类。 因 此, 带 有 多 个.class 文 件 的Java 程 序 在 执 行 时 与 传 统 程 序 相 比 就 有 其 特 殊 性。 传 统 的 程 序 在 运 行 前, 系 统 要 装 入 含 有 全 部 程 序 码 的 单 一 执 行 文 件, 而Java 虚 拟 机 在 执 行 程 序 时 则 不 同, 它 遵 循" 即 用 即 装 入" 的 原 则。 具 体 讲, 由 于 一 个.class 文 件 可 以 引 用 许 多 其 它.class 文 件( 在Java 语 言 中, 通 过import,implement 或extends 语 句 实 现), 当 运 行 的 类 需 要 其 他 类 时,Java 虚 拟 机 即 从 网 络 或 本 地 文 件 系 统 装 入.class 文 件。 将 这 个 概 念 拓 广, 不 同 类 可 以 由 不 同 开 发 者 在 不 同 服 务 器 上 开 发,Java 虚 拟 机 能 够 动 态 地 装 入 和 联 接 所 需 要 的 类 文 件。 这 对 今 后 软 件 开 发 以 及 分 布 式 计 算 都 将 有 深 远 的 意 义。 例 如: 这 种 结 构 可 以 使 在 服 务 器 向 客 户 机 提 供 软 件 新 版 本 时, 只 更 新 相 应 的.class 文 件, 真 正 实 现 零 管 理 客 户 机 以 及 无 版 本 软 件 等。
另 外,Java 虚 拟 机 是 使.class 文 件 具 有 跨 平 台 能 力 的 核 心 结 构, 同 一.class 文 件 可 以 运 行 在 实 现Java 虚 拟 机 的 不 同 计 算 机 上。 虚 拟 机 只 需 要 知 道.class 文 件 应 该 是 什 么 结 构 和 应 当 包 含 什 么, 而 不 必 管.class 文 件 对 应 的 源 程 序 代 码 是 由 何 种 语 言 编 写 的。 由 于 各 种 语 言 的 编 译 器 与Java 虚 拟 机 本 身 无 关, 因 此 只 要 不 同 语 言 的 编 译 器 能 从 这 些 源 文 件 中 产 生Java 字 节 码, 开 发 人 员 就 可 以 使 用 各 人 所 熟 悉 的Ada,C 或C + + 语 言 编 写 的 运 行 在 任 何Java 虚 拟 机 上 的 应 用 程 序, 而 不 必 一 定 要 学 习Java 语 言。 实 现 以 上 所 说 的 内 容, 将 大 大 简 化 现 有 软 件 向 平 台 无 关 软 件 转 化 的 工 作。
2、Java 虚 拟 机 结 构
Java 虚 拟 机 体 系 结 构 包 括 以 下 部 分: 数 据 类 型、 指 令 组、 寄 存 器 组、 方 法 区、 无 用 单 元 回 收 堆, 下 面 分 别 介 绍。
Java 虚 拟 机 规 定 了 统 一 的 数 据 类 型 以 及 类 型 长 度。 例 如, 整 型 为32 位 长, 浮 点 为IEEE 754 格 式 等 等。 对 于 各 种 操 作 系 统 如 硬 件 数 据 类 型 长 度 是 相 同 的。 程 序 没 有 改 变 数 据 类 型 的 自 由。
Java 虚 拟 机 的 寄 存 器 用 于 保 存 机 器 的 运 行 状 态, 它 们 同 微 处 理 器 的 寄 存 器 很 类 似。Java 虚 拟 机 寄 存 器 有 四 种:
pc: Java 程 序 计 数 器, 包 含 下 一 字 节 码 指 令 的 地 址
optop: 指 向 操 作 数 栈 顶 端 的 指 针
frame: 指 向 当 前 执 行 方 法 的 执 行 环 境 的 指 针
var: 指 向 当 前 执 行 方 法 局 部 变 量 区 第 一 个 变 量 的 指 针
Java 虚 拟 机 是 栈 式 的, 它 不 定 义 或 使 用 寄 存 器 来 传 递 或 接 受 参 数, 其 目 的 是 为 了 保 证 指 令 集 的 简 洁 性 和 实 现 时 的 高 效 性( 特 别 是 对 于 寄 存 器 数 目 不 多 的 处 理 器)。
Java 虚 拟 机 的 方 法 区 是 编 译 后 的 代 码 区 域, 它 包 括 方 法 代 码、 符 号 表 等。
Java 虚 拟 机 的 栈 有 三 个 区 域: 局 部 变 量 区、 执 行 环 境 区、 操 作 数 区。Java 虚 拟 机 并 不 保 证 任 何 内 存 单 元 回 收 的 时 间 安 排, 所 以Java 编 程 人 员 不 要 误 以 为 只 要 对 象 不 再 在 程 序 中 使 用, 对 象 占 用 的 内 存 就 立 即 可 用。 这 就 意 味 着, 开 发 需 要 大 量 内 存 的 程 序 时 必 须 格 外 小 心, 连 续 申 请 内 存 可 能 引 起 内 存 不 足 的 错 误。
3.Java 虚 拟 机 的 安 全 措 施。
前 面 已 经 提 到,Java 程 序 可 以 从 网 络 上 下 载 运 行, 这 必 然 带 来 许 多 不 安 全 因 素。 一 些 恶 意 的Hacker 可 以 直 接 写 出 字 节 代 码 段 攻 击 用 户 节 点, 如 删 除 文 件、 搞 乱 硬 盘 或 未 经 用 户 许 可 在 网 上 发 送 本 地 信 息 等。 这 些 防 卫 本 地 机 被 攻 击 的 任 务 就 交 给 了Java 虚 拟 机 完 成。Java 虚 拟 机 提 供 了 几 种 安 全 机 制, 其 中 两 种 主 要 的 机 制 是 安 全 管 理 器 和Java 类 文 件 认 证 器。
安 全 管 理 器 是 安 全 的 实 施 者, 它 是 一 个 可 扩 展 类, 提 供 加 在 应 用 程 序 和 特 写 系 统 上 的 安