1 Java 动 态 类 加 载 机 制 分 析 及 其 应 用 崔 行 臣, 赵 佟 ( 山 东 广 播 电 视 大 学 现 代 教 育 技 术 中 心, 济 南 250014) 摘 要 : Java 虚 拟 机 (JVM) 中 的 类 加 载 机 制 可 以 在 Java 应 用 程 序 运 行 期 间 动 态 加 载 类 文 件, 而 不 影 响 其 它 功 能 模 块 的 正 常 运 行. 通 过 对 Java 类 加 载 器 的 层 次 体 系 结 构, 动 态 类 加 载 机 制 原 理 实 现 过 程 进 行 分 析, 将 Java 动 态 类 加 载 机 制 应 用 到 高 校 网 站 管 理 平 台 的 文 件 发 布 模 块 中, 使 得 设 计 好 的 静 态 网 页 和 后 台 管 理 系 统 相 关 联, 通 过 自 定 义 加 载 器 来 加 载 加 密 过 的 Java 类 文 件. 这 样 以 可 插 拔 的 方 式 快 速 的 部 署 二 级 网 站, 增 强 了 网 站 管 理 平 台 的 灵 活 性 和 可 扩 展 性. 关 键 词 : Java 虚 拟 机 ; 类 加 载 器 ; 委 托 模 型 ; 动 态 类 加 载 机 制 Java Dynamic Class Loading Mechanism Analysis and Its Application CUI Xing-Chen, ZHAO Tong (Center for Educational Technology, Shandong Radio & TV University, Jinan 250014, China) Abstract: In order to load Java class file during the Java application runtime and without affecting the normal operation of other functional modules, the realization of Java dynamic class loading method is given based on the java virtual machine (JVM) mechanism. Java Class Loader architecture, theory of dynamic class loading mechanism, the implementation process are analyzed, and which are applied to the file release module of web site management platform system. The file release module is designed to make static web pages and website management system linked. Through the custom loader to loading encryption of Java class files. In a hot swap way to implement the deployment of secondary website, enhance the site management platform's flexibility and expansibility. Key words: Java virtual machine; class loader; delegation model; dynamic class loading mechanism 动 态 加 载 是 一 种 在 运 行 时 安 装 程 序 组 件 的 技 术. 许 多 操 作 系 统 如 Unix Microsoft Windows 使 用 的 动 态 连 接 就 是 一 种 动 态 加 载 技 术. 使 用 动 态 连 接 后, 程 序 中 的 符 号 引 用 可 以 在 程 序 被 加 载 到 内 存 后 才 替 换 成 相 应 的 机 器 地 址, 并 且 直 到 第 一 次 使 用 时 符 号 引 用 才 被 替 换. 与 静 态 连 接 相 比, 动 态 连 接 具 有 增 加 程 序 灵 活 性 节 约 内 存 空 间 的 优 点 [1]. Java 动 态 类 加 载 是 指 可 以 使 运 行 中 的 程 序 去 调 用 在 源 代 码 中 未 提 及 而 在 程 序 运 行 中 所 用 的 类. 一 个 应 用 程 序 总 是 由 n 多 个 类 组 成, Java 程 序 启 动 时, 并 不 是 一 次 把 所 有 的 类 全 部 加 载 后 再 运 行, 它 总 是 先 把 保 证 程 序 运 行 的 基 础 类 一 次 性 加 载 到 JVM 中, 其 它 类 等 到 JVM 用 到 的 时 候 再 加 载, 这 样 的 好 处 是 节 省 了 内 存 的 开 销, 因 为 Java 最 早 就 是 为 嵌 入 式 系 统 而 设 计 的, 内 存 宝 贵, 而 用 到 时 再 加 载 这 也 是 Java 动 态 性 的 一 种 体 现. 本 文 介 绍 了 Java 类 加 载 器 的 体 系 架 构, 研 究 探 讨 了 Java 动 态 类 加 载 机 制 的 原 理 及 实 现, 并 将 其 应 用 到 高 校 网 站 通 用 管 理 系 统 的 文 件 发 布 模 块 和 类 文 件 加 密 中, 实 现 了 基 于 网 站 通 用 管 理 平 台 建 设 新 的 二 级 网 站 的 热 插 拔 扩 展, 有 效 的 平 衡 了 平 台 的 扩 展 性 和 稳 定 性 之 间 的 关 系, 达 到 了 实 现 高 校 二 级 部 门 网 站 系 统 易 扩 展 部 署 方 便 等 目 的. 1 Java 类 加 载 器 的 层 次 体 系 架 构 Java 中 的 所 有 类, 必 须 被 装 载 到 jvm 中 才 能 运 行, 这 个 装 载 工 作 是 由 jvm 中 的 类 加 载 器 完 成 的, 类 加 载 1 收 稿 时 间 :2012-12-26; 收 到 修 改 稿 时 间 :2013-01-21 Research and Development 研 究 开 发 187
计 算 机 系 统 应 用 http://www.c-s-a.org.cn 2013 年 第 22 卷 第 7 期 器 所 做 的 工 作 实 质 是 把 类 文 件 从 硬 盘 读 取 到 内 存 中. 对 于 Java 中 的 类 大 致 可 以 分 为 三 种 : Java 系 统 核 心 类 扩 展 类 和 由 程 序 员 自 定 义 的 类. jvm 的 类 加 载 器 也 至 少 有 三 种 : Bootstrap classloader ExtClassLoader 和 AppClassLoader, 分 别 负 责 加 载 Java 系 统 核 心 类, 扩 展 类 和 程 序 员 定 义 的 应 用 类. Bootstrap classloader 是 系 统 中 唯 一 的 用 编 写 虚 拟 机 的 语 言 编 写 的 类 加 载 器. 如 果 JVM 是 用 C/C++ 实 现 的, 则 Bootstrap classloader 也 是 用 C/C++ 编 写, 在 Java 中 Bootstrap ClassLoader 用 null 表 示 [2]. Bootstrap Loader 用 默 认 方 式 从 JRE 中 加 载 Java 运 行 环 境 提 供 的 所 有 核 心 类, 如 JRE 目 录 下 的 rt.jar, charsets.jar 等. 这 些 类 是 所 有 应 用 程 序 必 须 的, 因 此 不 是 即 用 即 装, 而 是 首 先 装 入 并 永 驻 JVM, 直 至 JVM 退 出 的. 类 加 载 器 实 质 上 也 是 Java 类, 因 为 Java 类 的 类 加 载 器 本 身 也 要 被 类 加 载 器 加 载, 显 然 必 须 要 第 一 个 类 加 载 器 本 身 不 是 Java 类, 这 正 是 Bootstrap 根 引 导 类 加 载 器. Java 核 心 类 之 外 的 类 是 由 ExtClassLoader 和 AppClassLoader 来 完 成 加 载 的. ExtClassLoader 负 责 装 载 JRE 扩 展 目 录 ext 下 的 jar 类 包 ; AppClassLoader 负 责 装 载 classpath 路 径 下 的 类 包. JVM 中 的 所 有 类 加 载 器 采 用 具 有 父 子 关 系 的 树 形 结 构 进 行 组 织, 即 根 加 载 器 是 ExtClassLoader 的 父 加 载 器, ExtClassLoader 是 AppClassLoader 的 父 加 载 器. 在 程 序 员 不 显 示 指 定 类 加 载 器 的 情 况 下 使 用 AppClassLoader 装 载 应 用 程 序 的 类. 除 了 JVM 默 认 的 三 个 加 载 器 以 外, 第 三 方 可 以 编 写 自 己 的 类 加 载 器, 以 实 现 一 些 特 殊 的 需 求, 例 如, 对 特 定 目 录 的 类 进 行 加 密, 只 有 用 我 们 自 己 的 类 加 载 器 才 能 解 密 并 加 载. 2 Java 动 态 类 加 载 机 制 原 理 JVM 解 释 字 节 码, 必 须 通 过 加 载 连 接 和 初 始 化 三 个 步 骤 : (1) 加 载 : 类 装 载 就 是 寻 找 类 或 接 口 字 节 码 文 件 进 行 解 析 并 构 造 JVM 内 部 对 象 表 示 的 组 件. (2) 连 接 : 连 接 是 把 已 经 加 载 的 二 进 制 数 据 合 并 到 虚 拟 机 的 运 行 时 状 态 中 去, 包 括 检 查 准 备 和 解 析 三 个 子 阶 段, 其 中 解 析 步 骤 是 可 以 选 择 的. (a) 检 查 : 检 查 载 入 的 class 文 件 数 据 的 正 确 性 ; (b) 准 备 : 为 类 的 静 态 变 量 分 配 存 储 空 间 ; (c) 解 析 : 将 符 号 引 用 转 成 直 接 引 用. (3) 初 始 化 : 对 静 态 变 量, 静 态 代 码 块 执 行 初 始 化 工 作. 如 图 1 所 示. 图 1 Java 类 的 加 载 与 连 接 过 程 由 上 一 节 可 知, JVM 运 行 时 至 少 会 产 生 三 个 类 加 载 器 : Bootstrap ClassLoader, Ext ClassLoader 和 App ClassLoader, 当 一 个 类 需 要 加 载 运 行 时, 为 了 协 调 多 个 类 加 载 器 工 作, Java 对 类 加 载 器 进 行 了 分 工 和 分 级, 不 同 级 别 的 类 加 载 器 负 责 加 载 不 同 的 类, JVM 采 用 基 于 类 加 载 器 层 次 关 系 的 全 盘 负 责 双 亲 委 托 模 型 机 制 实 现 按 需 加 载, 简 单 讲, 就 是 类 加 载 器 有 载 入 类 的 需 求 时, 会 先 请 示 其 父 类 加 载 器 使 用 其 搜 索 路 径 来 载 入, 如 果 父 类 加 载 器 找 不 到, 才 由 自 己 的 类 加 载 器 依 照 自 己 的 搜 索 路 径 搜 索 类, 该 搜 索 过 程 具 有 递 归 性. 全 盘 负 责 是 指 当 一 个 加 载 器 装 载 一 个 类 时, 除 非 显 式 的 使 用 另 外 一 个 加 载 器, 该 类 所 依 赖 及 引 用 的 类 也 由 这 个 加 载 器 载 入. 假 如 类 A 和 类 B 相 关 联, 当 JVM 加 载 类 A 后, 系 统 也 会 使 用 同 一 个 类 加 载 器 加 载 类 B. 关 联 的 种 类 有 很 多, 例 如 类 A 继 承 类 B, 又 例 如 类 A 的 方 法 中 创 建 了 类 B 的 实 例 等. 委 托 模 型 是 指, 当 一 个 加 载 器 被 请 求 装 载 某 个 类 时, 首 先 在 本 类 加 载 器 中 检 查 要 加 载 的 类 是 否 已 经 加 载, 如 果 加 载 了 就 直 接 返 回 以 前 加 载 过 的 这 个 类 对 象. 如 果 这 个 类 未 被 本 类 加 载 器 加 载 过, 那 么 它 把 这 个 类 名 交 给 它 的 父 类 加 载 器, 委 托 父 类 加 载 器 去 加 载. 若 父 加 载 器 能 装 载, 则 返 回 这 个 类 所 对 应 的 class 对 象, 否 则 继 续 向 上 级 提 交, 一 直 到 根 引 导 类 加 载 器, 显 然 这 是 一 个 递 归 的 调 用. 只 有 在 根 引 导 类 加 载 器 都 不 能 加 载 的 情 况 下 才 从 自 己 的 类 路 径 中 查 找 并 装 载 目 标 类. 这 一 点 是 从 安 全 方 面 考 虑 的, 试 想 如 果 一 个 人 写 了 一 个 恶 意 的 基 础 类 ( 如 java.lang.string) 并 加 载 到 JVM 将 会 引 起 严 重 的 后 果, 但 有 了 委 托 模 型, java.lang.string 永 远 是 由 根 加 188 研 究 开 发 Research and Development
载 器 来 装 载, 避 免 以 上 情 况 发 生 [3]. 全 盘 负 责 双 亲 委 托 模 型 机 制 如 图 2 所 示. 图 2 JVM 动 态 类 加 载 的 委 托 模 型 示 意 图 每 个 类 加 载 器 都 可 以 用 来 加 载 类, 而 且 同 一 个 类 可 以 在 不 同 的 类 加 载 器 中 多 次 加 载, 但 在 同 一 个 类 加 载 器 上 就 只 允 许 加 载 一 次. 这 是 因 为 当 类 加 载 器 加 载 一 个 类 之 前 会 先 检 查 这 个 类 是 否 被 本 类 加 载 器 加 载 过. 因 此, 在 JVM 中, 每 个 被 加 载 的 类 都 由 两 个 参 数 来 确 定, 一 个 是 类 的 名 字, 还 有 一 个 是 加 载 这 个 类 的 类 加 载 器 [4]. 类 文 件 被 装 载 解 析 后, 在 虚 拟 机 中 都 有 一 个 对 应 的 java.lang.class 对 象, 提 供 了 类 结 构 信 息 的 描 述, 且 每 个 Class 对 象 都 包 含 一 个 对 定 义 它 的 ClassLoader 的 引 用. 数 组 及 基 本 数 据 类 型, 甚 至 void 都 拥 有 对 应 的 Class 对 象. Class 类 没 有 public 的 构 造 方 法, Class 对 象 是 在 装 载 类 时 由 JVM 通 过 调 用 类 加 载 器 中 的 defineclass() 方 法 自 动 构 造 的. 3 Java 动 态 类 加 载 的 实 现 类 在 JVM 中 的 加 载 方 式 分 为 两 种 : 一 是 隐 式 加 载, 程 序 在 运 行 过 程 中 当 执 行 到 通 过 new 等 方 式 生 成 对 象 时, 隐 式 调 用 类 加 载 器 加 载 对 应 的 类 到 JVM 中 ; 二 是 显 式 装 载, 由 程 序 员 调 用 自 定 义 的 类 装 载 器 把 需 要 的 类 加 载 到 内 存 当 中, 其 方 式 又 分 为 两 种 : 一 是 通 过 Class.forName() 方 法, 二 是 由 类 java.lang.classloader 的 方 法 loadclass() 提 供. 显 式 加 载 大 大 提 高 了 程 序 的 灵 活 性. 自 定 义 类 加 载 器 可 以 从 Java.lang.ClassLoader 的 任 何 子 类 创 建 ( 可 以 从 构 造 方 法 ClassLoader (ClassLoader parent) 可 以 看 出, 需 要 指 定 一 个 父 加 载 器, 创 建 后 即 挂 到 JVM 加 载 器 层 次 树 中 ). 任 何 类 的 加 载 都 是 通 过 抽 象 类 ClassLoader 类 及 其 子 类 来 实 现 的, 它 是 Java 核 心 API 的 一 部 分, 属 于 Java.lang 包, 所 有 自 定 义 类 加 载 器 必 须 继 承 并 实 例 化 该 类. 重 要 方 法 有 [5] : (1) Class loadclass(string name, boolean resolve) : name 参 数 指 定 类 加 载 器 需 要 装 载 类 的 全 限 定 类 名. resolve 参 数 指 定 类 加 载 器 是 否 解 析 该 类. 在 初 始 化 类 之 前 应 考 虑 进 行 类 解 析 的 工 作, 但 并 不 是 所 有 的 类 都 需 要 解 析. 该 方 法 使 用 委 托 机 制 来 加 载 类. 首 先 它 执 行 findloadedclass 方 法, 在 本 类 加 载 器 中 检 查 要 加 载 的 类 是 否 己 经 加 载, 如 果 加 载 了 就 直 接 返 回 以 前 加 载 过 的 这 个 类 对 象. 否 则, 委 托 父 加 载 器 去 加 载 ( 调 用 loadclass 方 法 ), 最 后 调 用 findclass(string) 方 法 查 找 类. (2) Class findclass(string name): 使 用 指 定 的 二 进 制 名 称 查 找 类. 在 通 过 父 类 加 载 器 检 查 所 请 求 的 类 后, 此 方 法 将 被 loadclass 方 法 调 用. loadclass 的 缺 省 实 现 调 用 这 个 方 法, 并 可 以 通 过 覆 盖 来 定 制 它. 比 如 自 定 义 加 载 器, 首 先 继 承 抽 象 类 ClassLoader, 然 后 不 必 重 写 loadclass 方 法, 只 需 重 写 findclass 方 法 即 可, 这 样 自 定 义 的 加 载 器 仍 然 按 照 委 托 模 型 来 加 载 类. 这 种 设 计 模 式 属 于 模 板 方 法 设 计 模 式. (3) Class defineclass(string name, byte[] b, int off, int len): 该 方 法 将 一 个 字 节 数 组 转 换 为 类 的 字 节 码. (4) Class findsystemclass(string name) : 此 方 法 通 过 系 统 类 加 载 器 来 加 载 该 类 文 件, 如 果 存 在, 就 使 用 defineclass 将 原 始 字 节 转 换 成 Class 对 象, 以 将 该 文 件 转 换 成 类. (5) Class findloadedclass(string name), 如 果 Java 虚 拟 机 已 将 此 加 载 器 记 录 为 具 有 给 定 二 进 制 名 称 的 某 个 类 的 加 载 器, 则 返 回 该 二 进 制 名 称 的 类. 动 态 类 加 载 最 直 接 方 式 是 使 用 Java.lang.Class 的 forname() 方 法, 它 有 两 种 重 载 形 式 : public static Class<?> forname(string classname) throws ClassNotFoundException public static Class<?> forname(string name, boolean initialize, ClassLoader loader) 使 用 给 定 的 类 加 载 器 ( 第 三 个 参 数 指 定 ), 返 回 与 带 有 给 定 字 符 串 名 的 类 或 接 口 ( 第 一 个 参 数 指 定 ) 相 关 联 的 Class 对 象. 第 二 个 参 数 指 定 表 示 是 否 被 初 始 化. Class.forName("Foo") 等 效 于 : Class.forName("Foo",true,this.getClass().getClassL oader()) 实 现 动 态 类 加 载, 使 用 forname() 还 是 调 用 用 户 自 定 义 类 加 载 器 loadclass() 方 法 取 决 于 用 户 的 需 要. Research and Development 研 究 开 发 189
计 算 机 系 统 应 用 http://www.c-s-a.org.cn 2013 年 第 22 卷 第 7 期 一 般 情 况 下 使 用 forname(), 因 为 它 是 动 态 类 加 载 最 直 接 的 方 法. 另 外, 若 需 要 请 求 的 类 型 在 加 载 时 就 初 始 化, 则 不 得 不 使 用 forname() 方 法. 自 定 义 类 加 载 器 可 以 满 足 一 些 forname() 无 法 满 足 的 需 求. 如 从 网 络 上 下 载, 从 数 据 库 中 获 取, 从 加 密 文 件 中 提 取, 甚 至 动 态 地 创 建 它 们, 这 时 就 需 要 自 定 义 类 加 载 器. 创 建 自 定 义 类 加 载 器, 主 要 原 因 是 可 以 用 定 制 的 方 式 把 类 型 的 全 限 定 名 转 换 成 一 个 Java class 文 件 格 式 的 字 节 数 组, 并 使 用 自 定 义 类 加 载 器 而 不 是 forname() 方 法 对 代 码 安 全 性 进 行 保 护 [6]. 4 应 用 实 例 Java 语 言 的 类 加 载 器 功 能 非 常 强 大, 可 以 通 过 继 承 ClassLoader 类 并 重 载 类 方 法 来 实 现 一 些 控 制 程 序 加 载 过 程 的 功 能. 本 节 将 Java 动 态 类 加 载 机 制 应 用 到 高 校 二 级 网 站 管 理 系 统 的 文 件 发 布 模 块 中, 并 采 用 自 定 义 加 载 器 来 加 载 已 经 加 密 过 的 Java 类 文 件. 4.1 系 统 应 用 需 求 当 前 大 部 分 高 校 由 于 没 有 构 建 统 一 的 网 站 通 用 平 台, 各 高 校 的 二 级 部 门 各 自 为 阵, 将 大 量 人 力 和 物 力 花 在 网 站 的 重 复 建 设 上, 而 且 各 高 校 二 级 学 院 网 站 的 风 格 不 统 一 效 果 差, 不 利 于 展 示 高 校 的 整 体 形 象. 因 此, 构 建 一 个 高 校 网 站 通 用 平 台 应 用 于 高 校 的 各 个 二 级 学 院 具 有 非 常 重 要 的 意 义. 由 于 高 校 各 部 门 网 站 的 功 能 大 致 是 类 似 的, 如 权 限 管 理 栏 目 管 理 新 闻 管 理 等, 所 以 在 开 发 好 网 站 通 用 管 理 平 台 后, 如 果 要 建 设 一 个 二 级 部 门 网 站, 技 术 人 员 可 以 先 做 好 静 态 网 页, 然 后 在 通 用 管 理 平 台 中 为 二 级 网 站 分 配 栏 目, 公 共 功 能 之 外 的 个 性 差 异 需 求 通 过 文 件 发 布 模 块 以 可 插 拔 的 方 式 发 布 到 通 用 管 理 平 台 中, 经 过 简 单 的 配 置 即 可 完 成 一 个 二 级 部 门 网 站 的 建 设. 文 件 发 布 模 块 的 主 要 功 能 是 对 某 二 级 网 站 的 静 态 页 面 动 态 化, 使 得 设 计 好 的 静 态 网 页 和 后 台 管 理 系 统 相 关 联. 通 过 灵 活 的 发 布 模 块, 增 加 了 系 统 的 可 扩 展 性 灵 活 性 和 降 低 了 系 统 模 块 之 间 的 耦 合 性, 再 对 发 布 的 文 件 代 码 进 行 加 密 处 理, 增 强 了 系 统 安 全 性. 4.2 模 块 实 现 本 系 统 采 用 基 于 MVC 模 式 的 struts2 框 架 实 现. 文 件 发 布 模 块 需 要 完 成 以 下 工 作 : (1) 创 建 二 级 网 站 主 页 的 HomepageAction 类, 这 是 一 个 Struts2 Action, 负 责 获 取 主 页 栏 目 信 息 并 以 把 数 据 封 装 在 集 合 中 返 回, 在 视 图 层 采 用 struts2 标 签 展 示 出 来. 这 也 是 各 个 部 门 的 个 性 差 异 部 分. (2) 添 加 struts2 配 置 文 件 : 配 置 Action, 添 加 逻 辑 视 图 和 物 理 视 图 资 源 之 间 的 映 射. (3) 为 保 证 代 码 安 全 性, 需 要 对 上 传 代 码 进 行 加 密 处 理. 因 当 前 JVM 中 正 在 运 行 的 是 网 站 通 用 管 理 平 台, 对 于 为 每 个 部 门 主 页 提 交 的 Homepage 类 是 系 统 预 先 不 知 道 的 类 型, 并 且 对 于 编 译 后 的 class 文 件 进 行 加 密 处 理 后, 必 须 使 用 自 定 义 加 载 器 加 载 自 定 目 录 下 的 类 文 件 并 解 密, 否 则 就 不 能 正 确 解 析 原 来 的 类. (1) 实 现 代 码 加 密 的 自 定 义 加 载 器 源 代 码 如 下 : public class MyClassLoader extends ClassLoader{ private String classdir; // 需 要 类 加 载 器 加 载 的 类 文 件 的 目 录 public MyClassLoader(){ public MyClassLoader(String classdir){ super( null) ; / / 设 定 父 类 加 载 器 为 null this.classdir = classdir; @Override // / 重 写 父 类 的 findclass( ) 方 法, 用 于 按 照 用 户 自 定 义 要 求 实 现 类 的 加 载 protected Class<?> findclass(string name) throws ClassNotFoundException { String classfilename = classdir + "\\" + name.substring(name.lastindexof('.')+1) + ".class"; try { FileInputStream fis = new FileInputStream(classFileName); ByteArrayOutputStream bos = new ByteArrayOutputStream(); decrypt(fis,bos); // 解 密 处 理 方 法 fis.close(); byte[] bytes = bos.tobytearray(); return defineclass(bytes, 0, bytes.length); catch (Exception e) { e.printstacktrace(); return null; (2) 设 计 文 件 发 布 方 法. 设 计 deploymodule(string 190 研 究 开 发 Research and Development
name) 方 法 从 数 据 库 读 取 并 生 成 类 文 件 的 方 法, 其 部 分 源 码 如 下 : public void deploymodule ( string classdir ) throws ClassNotFoundException { Class clazz = new MyClassLoader(classdir). loadclass("cn.com.homepageaction"); Object o = (Object )clazz.newinstance(); / / 创 建 对 象, 利 用 Java 反 射 机 制 解 析 类 文 件 中 的 方 法 5 结 语 Java 动 态 类 加 载 是 Java 程 序 具 有 动 态 性 的 关 键 机 制, 也 是 JVM 的 一 项 核 心 技 术. 本 文 分 析 了 Java 类 加 载 器 的 体 系 结 构 动 态 类 加 载 机 制 的 原 理 实 现 技 术, 并 把 Java 类 加 载 机 制 应 用 到 高 校 部 门 网 站 通 用 管 理 平 台 中 的 文 件 发 布 模 块 和 加 密 类 文 件 加 载 中, 实 现 了 基 于 网 站 通 用 管 理 平 台 建 设 新 的 二 级 网 站 的 热 插 拔 扩 展, 使 得 平 台 具 有 更 好 的 扩 展 性 和 代 码 的 可 重 用 性, 对 加 密 后 的 字 节 码 只 能 用 自 定 义 加 载 器 进 行 解 密 并 加 载, 实 现 一 定 意 义 上 的 类 文 件 安 全. Java 动 态 类 加 载 机 制 的 应 用 还 有 很 多, Java 中 RMI( 远 程 方 法 调 用 ) 就 是 Java 动 态 类 加 载 机 制 的 一 个 典 型 应 用, 而 这 是 一 般 类 加 载 器 无 法 实 现, 只 有 通 过 自 定 义 加 载 策 略, 才 能 完 美 实 现 这 样 的 需 求. 参 考 文 献 1 左 天 军, 朱 智 林, 韩 俊 刚, 陈 平.Java 动 态 类 加 载 分 析. 计 算 机 科 学,2005,32(4):194 196. 2 周 志 明. 深 入 理 解 Java 虚 拟 机 :JVM 高 级 特 性 与 最 佳 实 践. 北 京 : 机 械 工 业 出 版 社,2010.191 197. 3 邓 洋 春.Java 虚 拟 机 关 键 机 制 研 究 与 实 践. 长 沙 : 中 南 大 学, 2009:3 28. 4 张 敦 华, 刘 建.Java 动 态 加 载 机 制 及 其 应 用. 计 算 机 工 程 与 设 计,2004,25( 3):432 441. 5 JDK6.0 API 文 档.http://docs.oracle.com/javase/6/docs/api/ index.html. 6 王 万 森, 龚 文.Java 动 态 类 加 载 机 制 研 究 及 应 用. 计 算 机 工 程 与 设 计,2011,32(6):2154 2158. ( 上 接 第 199 页 ) 3 龙 德 帆, 樊 尚 春, 庞 宏 冰. 用 于 原 木 材 积 检 测 的 图 像 处 理 与 分 析 算 法. 北 京 航 空 航 天 大 学 学 报,2005,31(1):82 85. 4 景 林, 黄 习 培. 成 捆 原 木 计 算 机 图 像 检 尺 系 统 研 究 及 应 用 计 算 机 应 用,2006,26(z2):137 139. 5 黄 习 培, 景 林. 原 木 端 面 图 像 检 尺 直 径 识 别 算 法 的 研 究. 林 业 机 械 与 木 工 设 备,2006,34(1):24 26. 6 Kass M, et al. Snakes: Active Contour Models. International Journal of Computer Vision, 1987,1(4):321 331. 7 Xu CY, et al. Snakes, shapes, and gradient vector flow. IEEE Trans. on Image Processing, 1998,7(3):359 369. 8 Li CM, et al. Level set evolution without re-initialization: A new variational formulation. IEEE Conference on Computer Vision and Pattern Recognition(CVPR05). 2005,1:433 436. 9 Rochery M, et al. Higher Order Active Contours. International Journal of Computer Vision, 2006,69(1):27 42. 10 Horváth P, et al. A higher-order active contour model of a gas of circles ' and its application to tree crown extraction, Pattern Recognition, 2009,42(5):699 709. 11 Li CM, et al. Minimization of Region-Scalable Fitting Energy for Image Segmentation. IEEE Trans. on Image Processing, 2008,17(10):1940 1949. 12 Zhu GP, et al. Gradient vector flow active contours with prior directional information, Pattern Recognition Letters, 2010,31(9):845 856. 13 Hough PVC. A method and means for recognizing complex patterns, U.S. Patent 3, 069, 654. 14 Chung KL, et al. Speed up the computation of randomized algorithms for detecting lines, circles, and ellipses using novel tuning and LUT-based voting platform. Applied Mathematics and Computation, 2007,190(1):132 149. Research and Development 研 究 开 发 191