回 页 首 相 关 的 类 和 接 口 要 了 解 Java 动 态 代 理 的 机 制, 首 先 需 要 了 解 以 下 相 关 的 类 或 接 口 : java.lang.reflect.proxy: 这 是 Java 动 态 代 理 机 制 的 主 类, 它 提 供 了 一 组 静 态 方 法



Similar documents
《C语言基础入门》课程教学大纲

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

第2章 数据类型、常量与变量

I

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知


全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

Microsoft Word - 第7章 图表反转形态.doc

一、资质申请

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

修改版-操作手册.doc

深圳市新亚电子制程股份有限公司

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>

国债回购交易业务指引

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

上海证券交易所会议纪要

一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

登录、注册功能的测试用例设计.doc

教师上报成绩流程图

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

Microsoft Word - 文件汇编.doc

 编号:


目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

工 程 勘 察 资 质 标 准 根 据 建 设 工 程 勘 察 设 计 管 理 条 例 和 建 设 工 程 勘 察 设 计 资 质 管 理 规 定, 制 定 本 标 准 一 总 则 ( 一 ) 本 标 准 包 括 工 程 勘 察 相 应 专 业 类 型 主 要 专 业 技 术 人 员 配 备 技 术

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

珠江钢琴股东大会

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审


0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

课程类 别

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

工 程 造 价 咨 询 企 业 管 理 系 统 操 作 手 册 目 录 1 造 价 企 业 登 录 企 业 基 本 信 息 查 看 企 业 人 员 信 息 查 看 企 业 基 本 信 息 操 作 企 业 简 介 企 业 章


采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

Template BR_Rec_2005.dot

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

徐天宏:《基因天堂》.doc

电信系教学大纲的基本规范

·岗位设置管理流程

中 国 软 科 学 年 第 期!!!

2 根 据 广 东 省 交 通 建 设 工 程 施 工 现 场 开 工 前 考 核 评 表 或 根 据 广 东 省 交 通 建 设 工 程 施 工 现 场 实 施 过 程 考 核 评 表 的 和 内 容 进 行 核 查 ; 3 现 场 抽 查 具 有 代 表 性 的 各 岗 位 人 员 ( 从 事

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

2006年顺德区高中阶段学校招生录取分数线

4 进 入 交 互 区 设 置 的 组 件 管 理, 在 组 件 管 理 中, 教 师 可 以 选 择 课 程 空 间 中 的 所 有 组 件, 并 通 过 点 击 启 用 或 不 启 用 选 定 组 件 在 课 程 空 间 中 的 显 示 5 进 入 工 作 室 管 理 的 工 作 室 首 页,

正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

untitled

现 场 会 议 时 间 为 :2016 年 5 月 19 日 网 络 投 票 时 间 为 :2016 年 5 月 18 日 年 5 月 19 日 其 中 通 过 深 圳 证 券 交 易 所 交 易 系 统 进 行 网 络 投 票 的 时 间 为 2016 年 5 月 19 日 9:30-

第 三 章 审 计 证 据 2

上海证券交易所会议纪要

国际财务报告准则第13号——公允价值计量

用节点法和网孔法进行电路分析

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。

云信Linux SSH认证代理用户手册

第 期 李 伟 等 用 方 法 对 中 国 历 史 气 温 数 据 插 值 可 行 性 讨 论

第二讲 数列

新, 各 地 各 部 门 ( 单 位 ) 各 文 化 事 业 单 位 要 高 度 重 视, 切 实 加 强 领 导, 精 心 组 织 实 施 要 根 据 事 业 单 位 岗 位 设 置 管 理 的 规 定 和 要 求, 在 深 入 调 查 研 究 广 泛 听 取 意 见 的 基 础 上, 研 究 提

全国教师资格认定管理信息系统

( 此 页 无 正 文, 为 广 东 东 方 精 工 科 技 股 份 有 限 公 司 关 于 提 供 资 料 真 实 准 确 和 完 整 的 承 诺 函 之 签 署 页 ) 广 东 东 方 精 工 科 技 股 份 有 限 公 司 法 定 代 表 人 : 唐 灼 林 2016 年 7 月 28 日

Microsoft Word - 第3章.doc

合 并 计 算 配 售 对 象 持 有 多 个 证 券 账 户 的, 多 个 证 券 账 户 市 值 合 并 计 算 确 认 多 个 证 券 账 户 为 同 一 配 售 对 象 持 有 的 原 则 为 证 券 账 户 注 册 资 料 中 的 账 户 持 有 人 名 称 有 效 身 份 证 明 文 件

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>

!!!!!!!!!!

公 开 刊 物 须 有 国 内 统 一 刊 (CN), 发 表 文 章 的 刊 物 需 要 在 国 家 新 闻 出 版 广 电 总 局 ( 办 事 服 务 便 民 查 询 新 闻 出 版 机 构 查 询 ) 上 能 够 查 到 刊 凡 在 有 中 国 标 准 书 公 开

一 六 年 级 下 册 教 科 书 总 体 说 明 ( 一 ) 教 学 内 容 本 册 教 科 书 一 共 安 排 了 5 个 教 学 单 元, 其 中 前 4 个 单 元 为 新 知 识, 第 五 单 元 是 对 整 个 小 学 阶 段 所 学 数 学 知 识 系 统 的 整 理 和 复 习

年 8 月 11 日, 公 司 召 开 2015 年 第 五 次 临 时 股 东 大 会, 审 议 通 过 了 关 于 公 司 <2015 年 股 票 期 权 激 励 计 划 ( 草 案 )> 及 其 摘 要 的 议 案 关 于 提 请 股 东 大 会 授 权 董 事 会 办 理 公

中 中 中 中 部 中 岗 位 条 件 历 其 它 历 史 师 地 理 师 生 物 师 体 与 健 康 师 从 事 中 历 史 工 从 事 中 地 理 工 从 事 中 生 物 工 从 事 中 体 与 健 康 工 2. 课 程 与 论 ( 历 史 ); 2. 科 ( 历 史 )

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

自 服 务 按 钮 无 法 访 问 新 系 统 的 自 服 务 页 面 因 此 建 议 用 户 从 信 网 中 心 ( 主 页, 右 下 角 位 置 的 常 用 下 载, 或 校 园 网 用 户 自 服 务 ( 首 页

关于修订《沪市股票上网发行资金申购

<4D F736F F D20D0A3B7A2A1B A1B BAC5B9D8D3DAD7E9D6AFBFAAD5B9C8ABD0A3BDCCD6B0B9A4B8DACEBBC6B8D3C3B1E4B6AFB9A4D7F7B5C4CDA8D6AA2E646F63>

四川省卫生厅关于开展医疗美容主诊医师资格考试及换证工作的通知

境 外 上 市 外 资 股 股 东 持 有 股 份 总 数 (H 股 ) 489,157,907 3 出 席 会 议 的 股 东 所 持 有 表 决 权 股 份 数 占 公 司 有 表 决 权 股 份 总 数 的 其 中 :A 股 股 东 持 股 占 股 份 总 数 的

附件1:

2 任 务 目 标 任 务 实 施 学 一 学 安 全 用 电 1. 安 全 用 电 的 意 义 2. 人 体 触 电 的 基 本 知 识 1 2 1mA 10 30mA 50mA 100mA 750ms Hz


证券代码: 证券简称:长城电脑 公告编号:

光明乳业股份有限公司

北京信息科技大学本科学生成绩管理办法

在2012年工作会议结束时的讲话

2014年中央财经大学研究生招生录取工作简报

ETF、分级基金规模、份额变化统计

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

包 头 北 方 创 业 股 份 有 限 公 司 2016 年 第 二 次 临 时 股 东 大 会 会 议 须 知 为 维 护 股 东 合 法 权 益, 确 保 包 头 北 方 创 业 股 份 有 限 公 司 ( 以 下 简 称 公 司 )2016 年 第 二 次 临 时 股 东 大 会 ( 以 下

<4D F736F F D20B6C0C1A2B6ADCAC2D0ECCCFABEFDCFC8C9FABCB0CCE1C3FBC8CBC9F9C3F72E646F63>

思 想 政 治 理 论 经 核 查 无 误 思 想 政 治 理 论 经 核 查 无 误 思 想 政 治 理 论 经 核 查 无 误 思 想

Transcription:

Java 动 态 代 理 机 制 分 析 及 扩 展, 第 1 部 分 引 言 Java 动 态 代 理 机 制 的 出 现, 使 得 Java 开 发 人 员 不 用 手 工 编 写 代 理 类, 只 要 简 单 地 指 定 一 组 接 口 及 委 托 类 对 象, 便 能 动 态 地 获 得 代 理 类 代 理 类 会 负 责 将 所 有 的 方 法 调 用 分 派 到 委 托 对 象 上 反 射 执 行, 在 分 派 执 行 的 过 程 中, 开 发 人 员 还 可 以 按 需 调 整 委 托 类 对 象 及 其 功 能, 这 是 一 套 非 常 灵 活 有 弹 性 的 代 理 框 架 通 过 阅 读 本 文, 读 者 将 会 对 Java 动 态 代 理 机 制 有 更 加 深 入 的 理 解 本 文 首 先 从 Java 动 态 代 理 的 运 行 机 制 和 特 点 出 发, 对 其 代 码 进 行 了 分 析, 推 演 了 动 态 生 成 类 的 内 部 实 现 回 页 首 代 理 : 设 计 模 式 代 理 是 一 种 常 用 的 设 计 模 式, 其 目 的 就 是 为 其 他 对 象 提 供 一 个 代 理 以 控 制 对 某 个 对 象 的 访 问 代 理 类 负 责 为 委 托 类 预 处 理 消 息, 过 滤 消 息 并 转 发 消 息, 以 及 进 行 消 息 被 委 托 类 执 行 后 的 后 续 处 理 图 1. 代 理 模 式 为 了 保 持 行 为 的 一 致 性, 代 理 类 和 委 托 类 通 常 会 实 现 相 同 的 接 口, 所 以 在 访 问 者 看 来 两 者 没 有 丝 毫 的 区 别 通 过 代 理 类 这 中 间 一 层, 能 有 效 控 制 对 委 托 类 对 象 的 直 接 访 问, 也 可 以 很 好 地 隐 藏 和 保 护 委 托 类 对 象, 同 时 也 为 实 施 不 同 控 制 策 略 预 留 了 空 间, 从 而 在 设 计 上 获 得 了 更 大 的 灵 活 性 Java 动 态 代 理 机 制 以 巧 妙 的 方 式 近 乎 完 美 地 实 践 了 代 理 模 式 的 设 计 理 念

回 页 首 相 关 的 类 和 接 口 要 了 解 Java 动 态 代 理 的 机 制, 首 先 需 要 了 解 以 下 相 关 的 类 或 接 口 : java.lang.reflect.proxy: 这 是 Java 动 态 代 理 机 制 的 主 类, 它 提 供 了 一 组 静 态 方 法 来 为 一 组 接 口 动 态 地 生 成 代 理 类 及 其 对 象 清 单 1. Proxy 的 静 态 方 法 // 方 法 1: 该 方 法 用 于 获 取 指 定 代 理 对 象 所 关 联 的 调 用 处 理 器 static InvocationHandler getinvocationhandler(object proxy) // 方 法 2: 该 方 法 用 于 获 取 关 联 于 指 定 类 装 载 器 和 一 组 接 口 的 动 态 代 理 类 的 类 对 象 static Class getproxyclass(classloader loader, Class[] interfaces) // 方 法 3: 该 方 法 用 于 判 断 指 定 类 对 象 是 否 是 一 个 动 态 代 理 类 static boolean isproxyclass(class cl) // 方 法 4: 该 方 法 用 于 为 指 定 类 装 载 器 一 组 接 口 及 调 用 处 理 器 生 成 动 态 代 理 类 实 例 static Object newproxyinstance(classloader loader, Class[] interfaces, InvocationHandler h) java.lang.reflect.invocationhandler: 这 是 调 用 处 理 器 接 口, 它 自 定 义 了 一 个 invoke 方 法, 用 于 集 中 处 理 在 动 态 代 理 类 对 象 上 的 方 法 调 用, 通 常 在 该 方 法 中 实 现 对 委 托 类 的 代 理 访 问 清 单 2. InvocationHandler 的 核 心 方 法 // 该 方 法 负 责 集 中 处 理 动 态 代 理 类 上 的 所 有 方 法 调 用 第 一 个 参 数 既 是 代 理 类 实 例, 第 二 个 参 数 是 被 调 用 的 方 法 对 象 // 第 三 个 方 法 是 调 用 参 数 调 用 处 理 器 根 据 这 三 个 参 数 进 行 预 处 理 或 分 派 到 委 托 类 实 例 上 发 射 执 行 Object invoke(object proxy, Method method, Object[] args)

每 次 生 成 动 态 代 理 类 对 象 时 都 需 要 指 定 一 个 实 现 了 该 接 口 的 调 用 处 理 器 对 象 ( 参 见 Proxy 静 态 方 法 4 的 第 三 个 参 数 ) java.lang.classloader: 这 是 类 装 载 器 类, 负 责 将 类 的 字 节 码 装 载 到 Java 虚 拟 机 (JVM) 中 并 为 其 定 义 类 对 象, 然 后 该 类 才 能 被 使 用 Proxy 静 态 方 法 生 成 动 态 代 理 类 同 样 需 要 通 过 类 装 载 器 来 进 行 装 载 才 能 使 用, 它 与 普 通 类 的 唯 一 区 别 就 是 其 字 节 码 是 由 JVM 在 运 行 时 动 态 生 成 的 而 非 预 存 在 于 任 何 一 个.class 文 件 中 每 次 生 成 动 态 代 理 类 对 象 时 都 需 要 指 定 一 个 类 装 载 器 对 象 ( 参 见 Proxy 静 态 方 法 4 的 第 一 个 参 数 ) 回 页 首 代 理 机 制 及 其 特 点 首 先 让 我 们 来 了 解 一 下 如 何 使 用 Java 动 态 代 理 具 体 有 如 下 四 步 骤 : 1. 通 过 实 现 InvocationHandler 接 口 创 建 自 己 的 调 用 处 理 器 ; 2. 通 过 为 Proxy 类 指 定 ClassLoader 对 象 和 一 组 interface 来 创 建 动 态 代 理 类 ; 3. 通 过 反 射 机 制 获 得 动 态 代 理 类 的 构 造 函 数, 其 唯 一 参 数 类 型 是 调 用 处 理 器 接 口 类 型 ; 4. 通 过 构 造 函 数 创 建 动 态 代 理 类 实 例, 构 造 时 调 用 处 理 器 对 象 作 为 参 数 被 传 入 清 单 3. 动 态 代 理 对 象 创 建 过 程 // InvocationHandlerImpl 实 现 了 InvocationHandler 接 口, 并 能 实 现 方 法 调 用 从 代 理 类 到 委 托 类 的 分 派 转 发 // 其 内 部 通 常 包 含 指 向 委 托 类 实 例 的 引 用, 用 于 真 正 执 行 分 派 转 发 过 来 的 方 法 调 用 InvocationHandler handler = new InvocationHandlerImpl(..); // 通 过 Proxy 为 包 括 Interface 接 口 在 内 的 一 组 接 口 动 态 创 建 代 理 类 的 类 对 象 Class clazz = Proxy.getProxyClass(classLoader, new Class[] { Interface.class,... ); // 通 过 反 射 从 生 成 的 类 对 象 获 得 构 造 函 数 对 象 Constructor constructor = clazz.getconstructor(new Class[] { InvocationHandler.class );

// 通 过 构 造 函 数 对 象 创 建 动 态 代 理 类 实 例 Interface Proxy = (Interface)constructor.newInstance(new Object[] { handler ); 实 际 使 用 过 程 更 加 简 单, 因 为 Proxy 的 静 态 方 法 newproxyinstance 已 经 为 我 们 封 装 了 步 骤 2 到 步 骤 4 的 过 程, 所 以 简 化 后 的 过 程 如 下 清 单 4. 简 化 的 动 态 代 理 对 象 创 建 过 程 // InvocationHandlerImpl 实 现 了 InvocationHandler 接 口, 并 能 实 现 方 法 调 用 从 代 理 类 到 委 托 类 的 分 派 转 发 InvocationHandler handler = new InvocationHandlerImpl(..); // 通 过 Proxy 直 接 创 建 动 态 代 理 类 实 例 Interface proxy = (Interface)Proxy.newProxyInstance( classloader, new Class[] { Interface.class, handler ); 接 下 来 让 我 们 来 了 解 一 下 Java 动 态 代 理 机 制 的 一 些 特 点 首 先 是 动 态 生 成 的 代 理 类 本 身 的 一 些 特 点 1) 包 : 如 果 所 代 理 的 接 口 都 是 public 的, 那 么 它 将 被 定 义 在 顶 层 包 ( 即 包 路 径 为 空 ), 如 果 所 代 理 的 接 口 中 有 非 public 的 接 口 ( 因 为 接 口 不 能 被 定 义 为 protect 或 private, 所 以 除 public 之 外 就 是 默 认 的 package 访 问 级 别 ), 那 么 它 将 被 定 义 在 该 接 口 所 在 包 ( 假 设 代 理 了 com.ibm.developerworks 包 中 的 某 非 public 接 口 A, 那 么 新 生 成 的 代 理 类 所 在 的 包 就 是 com.ibm.developerworks), 这 样 设 计 的 目 的 是 为 了 最 大 程 度 的 保 证 动 态 代 理 类 不 会 因 为 包 管 理 的 问 题 而 无 法 被 成 功 定 义 并 访 问 ;2) 类 修 饰 符 : 该 代 理 类 具 有 final 和 public 修 饰 符, 意 味 着 它 可 以 被 所 有 的 类 访 问, 但 是 不 能 被 再 度 继 承 ;3) 类 名 : 格 式 是 $ProxyN, 其 中 N 是 一 个 逐 一 递 增 的 阿 拉 伯 数 字, 代 表 Proxy 类 第 N 次 生 成 的 动 态 代 理 类, 值 得 注 意 的 一 点 是, 并 不 是 每 次 调 用 Proxy 的 静 态 方 法 创 建 动 态 代 理 类 都 会 使 得 N 值 增 加, 原 因 是 如 果 对 同 一 组 接 口 ( 包 括 接 口 排 列 的 顺 序 相 同 ) 试 图 重 复 创 建 动 态 代 理 类, 它 会 很 聪 明 地 返 回 先 前 已 经 创 建 好 的 代 理 类 的 类 对 象, 而 不 会 再 尝 试 去 创 建 一 个 全 新 的 代 理 类, 这 样 可 以 节 省 不 必 要 的 代 码 重 复 生 成, 提 高 了 代 理 类 的 创 建 效 率 4) 类 继 承 关 系 : 该 类 的 继 承 关 系 如 图 :

图 2. 动 态 代 理 类 的 继 承 图 由 图 可 见,Proxy 类 是 它 的 父 类, 这 个 规 则 适 用 于 所 有 由 Proxy 创 建 的 动 态 代 理 类 而 且 该 类 还 实 现 了 其 所 代 理 的 一 组 接 口, 这 就 是 为 什 么 它 能 够 被 安 全 地 类 型 转 换 到 其 所 代 理 的 某 接 口 的 根 本 原 因 接 下 来 让 我 们 了 解 一 下 代 理 类 实 例 的 一 些 特 点 每 个 实 例 都 会 关 联 一 个 调 用 处 理 器 对 象, 可 以 通 过 Proxy 提 供 的 静 态 方 法 getinvocationhandler 去 获 得 代 理 类 实 例 的 调 用 处 理 器 对 象 在 代 理 类 实 例 上 调 用 其 代 理 的 接 口 中 所 声 明 的 方 法 时, 这 些 方 法 最 终 都 会 由 调 用 处 理 器 的 invoke 方 法 执 行, 此 外, 值 得 注 意 的 是, 代 理 类 的 根 类 java.lang.object 中 有 三 个 方 法 也 同 样 会 被 分 派 到 调 用 处 理 器 的 invoke 方 法 执 行, 它 们 是 hashcode,equals 和 tostring, 可 能 的 原 因 有 : 一 是 因 为 这 些 方 法 为 public 且 非 final 类 型, 能 够 被 代 理 类 覆 盖 ; 二 是 因 为 这 些 方 法 往 往 呈 现 出 一 个 类 的 某 种 特 征 属 性, 具 有 一 定 的 区 分 度, 所 以 为 了 保 证 代 理 类 与 委 托 类 对 外 的 一 致 性, 这 三 个 方 法 也 应 该 被 分 派 到 委 托 类 执 行 当 代 理 的 一 组 接 口 有 重 复 声 明 的 方 法 且 该 方 法 被 调 用 时, 代 理 类 总 是 从 排 在 最 前 面 的 接 口 中 获 取 方 法 对 象 并 分 派 给 调 用 处 理 器, 而 无 论 代 理 类 实 例 是 否 正 在 以 该 接 口 ( 或 继 承 于 该 接 口 的 某 子 接 口 ) 的 形 式 被 外 部 引 用, 因 为 在 代 理 类 内 部 无 法 区 分 其 当 前 的 被 引 用 类 型 接 着 来 了 解 一 下 被 代 理 的 一 组 接 口 有 哪 些 特 点 首 先, 要 注 意 不 能 有 重 复 的 接 口, 以 避 免 动 态 代 理 类 代 码 生 成 时 的 编 译 错 误 其 次, 这 些 接 口 对 于 类 装 载 器 必 须 可 见, 否 则 类 装 载 器 将 无 法 链 接 它 们, 将 会 导 致 类 定 义 失 败 再 次, 需 被 代 理 的 所 有 非 public 的 接 口 必 须 在 同 一 个 包 中, 否 则 代 理 类 生 成 也 会 失 败 最 后, 接 口 的 数 目 不 能 超 过 65535, 这 是 JVM 设 定 的 限 制 最 后 再 来 了 解 一 下 异 常 处 理 方 面 的 特 点 从 调 用 处 理 器 接 口 声 明 的 方 法 中 可 以 看 到 理 论 上 它 能 够 抛 出 任 何 类 型 的 异 常, 因 为 所 有 的 异 常 都 继 承 于 Throwable 接 口, 但 事 实 是 否 如 此 呢? 答 案 是 否 定 的, 原 因 是 我 们 必 须 遵 守 一 个 继 承 原 则 : 即 子 类 覆 盖 父 类 或 实 现 父 接 口 的 方 法 时, 抛 出 的 异 常 必 须 在 原 方 法 支 持 的 异 常 列 表 之 内 所 以 虽 然 调 用 处 理 器 理 论 上 讲 能 够, 但 实 际 上 往 往 受 限 制, 除 非 父 接 口 中 的 方 法 支 持 抛 Throwable 异 常 那 么 如 果 在 invoke 方 法 中 的 确 产 生 了 接 口 方 法 声 明 中 不 支 持 的 异 常, 那 将 如 何 呢? 放 心,Java 动 态 代 理 类 已 经 为 我 们 设 计 好 了 解 决 方 法 : 它 将 会 抛 出 UndeclaredThrowableException 异 常 这 个 异 常 是 一 个 RuntimeException 类 型, 所 以 不 会 引 起 编 译 错 误 通 过 该 异 常 的 getcause 方 法, 还 可 以 获 得 原 来 那 个 不 受 支 持 的 异 常 对 象, 以 便 于 错 误 诊 断

回 页 首 代 码 是 最 好 的 老 师 机 制 和 特 点 都 介 绍 过 了, 接 下 来 让 我 们 通 过 源 代 码 来 了 解 一 下 Proxy 到 底 是 如 何 实 现 的 首 先 记 住 Proxy 的 几 个 重 要 的 静 态 变 量 : 清 单 5. Proxy 的 重 要 静 态 变 量 // 映 射 表 : 用 于 维 护 类 装 载 器 对 象 到 其 对 应 的 代 理 类 缓 存 private static Map loadertocache = new WeakHashMap(); // 标 记 : 用 于 标 记 一 个 动 态 代 理 类 正 在 被 创 建 中 private static Object pendinggenerationmarker = new Object(); // 同 步 表 : 记 录 已 经 被 创 建 的 动 态 代 理 类 类 型, 主 要 被 方 法 isproxyclass 进 行 相 关 的 判 断 private static Map proxyclasses = Collections.synchronizedMap(new WeakHashMap()); // 关 联 的 调 用 处 理 器 引 用 protected InvocationHandler h; 然 后, 来 看 一 下 Proxy 的 构 造 方 法 : 清 单 6. Proxy 构 造 方 法 // 由 于 Proxy 内 部 从 不 直 接 调 用 构 造 函 数, 所 以 private 类 型 意 味 着 禁 止 任 何 调 用 private Proxy() { // 由 于 Proxy 内 部 从 不 直 接 调 用 构 造 函 数, 所 以 protected 意 味 着 只 有 子 类 可 以 调 用 protected Proxy(InvocationHandler h) {this.h = h; 接 着, 可 以 快 速 浏 览 一 下 newproxyinstance 方 法, 因 为 其 相 当 简 单 :

清 单 7. Proxy 静 态 方 法 newproxyinstance public static Object newproxyinstance(classloader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException { // 检 查 h 不 为 空, 否 则 抛 异 常 if (h == null) { throw new NullPointerException(); // 获 得 与 制 定 类 装 载 器 和 一 组 接 口 相 关 的 代 理 类 类 型 对 象 Class cl = getproxyclass(loader, interfaces); // 通 过 反 射 获 取 构 造 函 数 对 象 并 生 成 代 理 类 实 例 try { Constructor cons = cl.getconstructor(constructorparams); return (Object) cons.newinstance(new Object[] { h ); catch (NoSuchMethodException e) { throw new InternalError(e.toString()); catch (IllegalAccessException e) { throw new InternalError(e.toString()); catch (InstantiationException e) { throw new InternalError(e.toString()); catch (InvocationTargetException e) { throw new InternalError(e.toString()); 由 此 可 见, 动 态 代 理 真 正 的 关 键 是 在 getproxyclass 方 法, 该 方 法 负 责 为 一 组 接 口 动 态 地 生 成 代 理 类 类 型 对 象 在 该 方 法 内 部, 您 将 能 看 到 Proxy 内 的 各 路 英 雄 ( 静 态 变 量 ) 悉 数 登 场 有 点 迫 不 及 待 了 么? 那 就 让 我 们 一 起 走 进 Proxy 最 最 神 秘 的 殿 堂 去 欣 赏 一 番 吧 该 方 法 总 共 可 以 分 为 四 个 步 骤 : 1. 对 这 组 接 口 进 行 一 定 程 度 的 安 全 检 查, 包 括 检 查 接 口 类 对 象 是 否 对 类 装 载 器 可 见 并 且 与 类 装 载 器 所 能 识 别 的 接 口 类 对 象 是 完 全 相 同 的, 还 会 检 查 确 保 是 interface 类 型 而 不 是 class 类 型 这 个 步 骤 通 过 一 个 循 环 来 完 成, 检 查 通 过 后 将 会 得 到 一 个 包 含 所 有 接 口 名 称 的 字 符 串 数 组, 记 为 String[] interfacenames 总 体 上 这 部 分 实 现 比 较 直 观, 所 以 略 去 大 部 分 代 码, 仅 保 留 留 如 何 判 断 某 类 或 接 口 是 否 对 特 定 类 装 载 器 可 见 的 相 关 代 码

清 单 8. 通 过 Class.forName 方 法 判 接 口 的 可 见 性 try { // 指 定 接 口 名 字 类 装 载 器 对 象, 同 时 制 定 initializeboolean 为 false 表 示 无 须 初 始 化 类 // 如 果 方 法 返 回 正 常 这 表 示 可 见, 否 则 会 抛 出 ClassNotFoundException 异 常 表 示 不 可 见 interfaceclass = Class.forName(interfaceName, false, loader); catch (ClassNotFoundException e) { 2. 从 loadertocache 映 射 表 中 获 取 以 类 装 载 器 对 象 为 关 键 字 所 对 应 的 缓 存 表, 如 果 不 存 在 就 创 建 一 个 新 的 缓 存 表 并 更 新 到 loadertocache 缓 存 表 是 一 个 HashMap 实 例, 正 常 情 况 下 它 将 存 放 键 值 对 ( 接 口 名 字 列 表, 动 态 生 成 的 代 理 类 的 类 对 象 引 用 ) 当 代 理 类 正 在 被 创 建 时 它 会 临 时 保 存 ( 接 口 名 字 列 表,pendingGenerationMarker) 标 记 pendinggenerationmarke 的 作 用 是 通 知 后 续 的 同 类 请 求 ( 接 口 数 组 相 同 且 组 内 接 口 排 列 顺 序 也 相 同 ) 代 理 类 正 在 被 创 建, 请 保 持 等 待 直 至 创 建 完 成 清 单 9. 缓 存 表 的 使 用 do { // 以 接 口 名 字 列 表 作 为 关 键 字 获 得 对 应 cache 值 Object value = cache.get(key); if (value instanceof Reference) { proxyclass = (Class) ((Reference) value).get(); if (proxyclass!= null) { // 如 果 已 经 创 建, 直 接 返 回 return proxyclass; else if (value == pendinggenerationmarker) { // 代 理 类 正 在 被 创 建, 保 持 等 待 try { cache.wait(); catch (InterruptedException e) { // 等 待 被 唤 醒, 继 续 循 环 并 通 过 二 次 检 查 以 确 保 创 建 完 成, 否 则 重 新 等 待 continue;

else { // 标 记 代 理 类 正 在 被 创 建 cache.put(key, pendinggenerationmarker); // break 跳 出 循 环 已 进 入 创 建 过 程 break; while (true); 3. 动 态 创 建 代 理 类 的 类 对 象 首 先 是 确 定 代 理 类 所 在 的 包, 其 原 则 如 前 所 述, 如 果 都 为 public 接 口, 则 包 名 为 空 字 符 串 表 示 顶 层 包 ; 如 果 所 有 非 public 接 口 都 在 同 一 个 包, 则 包 名 与 这 些 接 口 的 包 名 相 同 ; 如 果 有 多 个 非 public 接 口 且 不 同 包, 则 抛 异 常 终 止 代 理 类 的 生 成 确 定 了 包 后, 就 开 始 生 成 代 理 类 的 类 名, 同 样 如 前 所 述 按 格 式 $ProxyN 生 成 类 名 也 确 定 了, 接 下 来 就 是 见 证 奇 迹 的 发 生 动 态 生 成 代 理 类 : 清 单 10. 动 态 生 成 代 理 类 // 动 态 地 生 成 代 理 类 的 字 节 码 数 组 byte[] proxyclassfile = ProxyGenerator.generateProxyClass( proxyname, interfaces); try { // 动 态 地 定 义 新 生 成 的 代 理 类 proxyclass = defineclass0(loader, proxyname, proxyclassfile, 0, proxyclassfile.length); catch (ClassFormatError e) { throw new IllegalArgumentException(e.toString()); // 把 生 成 的 代 理 类 的 类 对 象 记 录 进 proxyclasses 表 proxyclasses.put(proxyclass, null); 由 此 可 见, 所 有 的 代 码 生 成 的 工 作 都 由 神 秘 的 ProxyGenerator 所 完 成 了, 当 你 尝 试 去 探 索 这 个 类 时, 你 所 能 获 得 的 信 息 仅 仅 是 它 位 于 并 未 公 开 的 sun.misc 包, 有 若 干 常 量 变 量 和 方 法 以 完 成 这 个 神 奇 的 代 码 生 成 的 过 程, 但 是 sun 并 没 有 提 供 源 代 码 以 供 研 读 至 于 动 态 类 的 定 义, 则 由 Proxy 的 native 静 态 方 法 defineclass0 执 行 4. 代 码 生 成 过 程 进 入 结 尾 部 分, 根 据 结 果 更 新 缓 存 表, 如 果 成 功 则 将 代 理 类 的 类 对 象 引 用 更 新 进 缓 存 表, 否 则 清 楚 缓 存 表 中 对 应 关 键 值, 最 后 唤 醒 所 有 可 能 的 正 在 等 待 的 线 程

走 完 了 以 上 四 个 步 骤 后, 至 此, 所 有 的 代 理 类 生 成 细 节 都 已 介 绍 完 毕, 剩 下 的 静 态 方 法 如 getinvocationhandler 和 isproxyclass 就 显 得 如 此 的 直 观, 只 需 通 过 查 询 相 关 变 量 就 可 以 完 成, 所 以 对 其 的 代 码 分 析 就 省 略 了 回 页 首 代 理 类 实 现 推 演 分 析 了 Proxy 类 的 源 代 码, 相 信 在 读 者 的 脑 海 中 会 对 Java 动 态 代 理 机 制 形 成 一 个 更 加 清 晰 的 理 解, 但 是, 当 探 索 之 旅 在 sun.misc.proxygenerator 类 处 嘎 然 而 止, 所 有 的 神 秘 都 汇 聚 于 此 时, 相 信 不 少 读 者 也 会 对 这 个 ProxyGenerator 类 产 生 有 类 似 的 疑 惑 : 它 到 底 做 了 什 么 呢? 它 是 如 何 生 成 动 态 代 理 类 的 代 码 的 呢? 诚 然, 这 里 也 无 法 给 出 确 切 的 答 案 还 是 让 我 们 带 着 这 些 疑 惑, 一 起 开 始 探 索 之 旅 吧 事 物 往 往 不 像 其 看 起 来 的 复 杂, 需 要 的 是 我 们 能 够 化 繁 为 简, 这 样 也 许 就 能 有 更 多 拨 云 见 日 的 机 会 抛 开 所 有 想 象 中 的 未 知 而 复 杂 的 神 秘 因 素, 如 果 让 我 们 用 最 简 单 的 方 法 去 实 现 一 个 代 理 类, 唯 一 的 要 求 是 同 样 结 合 调 用 处 理 器 实 施 方 法 的 分 派 转 发, 您 的 第 一 反 应 将 是 什 么 呢? 听 起 来 似 乎 并 不 是 很 复 杂 的 确, 掐 指 算 算 所 涉 及 的 工 作 无 非 包 括 几 个 反 射 调 用, 以 及 对 原 始 类 型 数 据 的 装 箱 或 拆 箱 过 程, 其 他 的 似 乎 都 已 经 水 到 渠 成 非 常 地 好, 让 我 们 整 理 一 下 思 绪, 一 起 来 完 成 一 次 完 整 的 推 演 过 程 吧 清 单 11. 代 理 类 中 方 法 调 用 的 分 派 转 发 推 演 实 现 // 假 设 需 代 理 接 口 Simulator public interface Simulator { short simulate(int arg1, long arg2, String arg3) throws ExceptionA, ExceptionB; // 假 设 代 理 类 为 SimulatorProxy, 其 类 声 明 将 如 下 final public class SimulatorProxy implements Simulator { // 调 用 处 理 器 对 象 的 引 用 protected InvocationHandler handler; // 以 调 用 处 理 器 为 参 数 的 构 造 函 数 public SimulatorProxy(InvocationHandler handler){ this.handler = handler;

// 实 现 接 口 方 法 simulate public short simulate(int arg1, long arg2, String arg3) throws ExceptionA, ExceptionB { // 第 一 步 是 获 取 simulate 方 法 的 Method 对 象 java.lang.reflect.method method = null; try{ method = Simulator.class.getMethod( "simulate", new Class[] {int.class, long.class, String.class ); catch(exception e) { // 异 常 处 理 1( 略 ) // 第 二 步 是 调 用 handler 的 invoke 方 法 分 派 转 发 方 法 调 用 Object r = null; try { r = handler.invoke(this, method, // 对 于 原 始 类 型 参 数 需 要 进 行 装 箱 操 作 new Object[] {new Integer(arg1), new Long(arg2), arg3); catch(throwable e) { // 异 常 处 理 2( 略 ) // 第 三 步 是 返 回 结 果 ( 返 回 类 型 是 原 始 类 型 则 需 要 进 行 拆 箱 操 作 ) return ((Short)r).shortValue(); 模 拟 推 演 为 了 突 出 通 用 逻 辑 所 以 更 多 地 关 注 正 常 流 程, 而 淡 化 了 错 误 处 理, 但 在 实 际 中 错 误 处 理 同 样 非 常 重 要 从 以 上 的 推 演 中 我 们 可 以 得 出 一 个 非 常 通 用 的 结 构 化 流 程 : 第 一 步 从 代 理 接 口 获 取 被 调 用 的 方 法 对 象, 第 二 步 分 派 方 法 到 调 用 处 理 器 执 行, 第 三 步 返 回 结 果 在 这 之 中, 所 有 的 信 息 都 是 可 以 已 知 的, 比 如 接 口 名 方 法 名 参 数 类 型 返 回 类 型 以 及 所 需 的 装 箱 和 拆 箱 操 作, 那 么 既 然 我 们 手 工 编 写 是 如 此, 那 又 有 什 么 理 由 不 相 信 ProxyGenerator 不 会 做 类 似 的 实 现 呢? 至 少 这 是 一 种 比 较 可 能 的 实 现 接 下 来 让 我 们 把 注 意 力 重 新 回 到 先 前 被 淡 化 的 错 误 处 理 上 来 在 异 常 处 理 1 处, 由 于 我 们 有 理 由 确 保 所 有 的 信 息 如 接 口 名 方 法 名 和 参 数 类 型 都 准 确 无 误, 所 以 这 部 分 异 常 发 生 的 概 率 基 本 为 零, 所 以 基 本 可 以 忽 略 而 异 常 处 理 2 处, 我 们 需 要 思 考 得 更 多 一 些 回 想 一 下, 接 口 方 法 可 能 声 明 支 持 一 个 异 常 列 表, 而 调 用 处 理 器 invoke 方 法 又 可 能 抛 出 与 接 口 方 法 不 支 持 的 异 常, 再 回 想 一 下 先 前 提 及 的 Java 动 态 代 理 的 关 于 异 常 处 理 的 特 点, 对 于 不 支 持 的 异 常, 必 须 抛

UndeclaredThrowableException 运 行 时 异 常 所 以 通 过 再 次 推 演, 我 们 可 以 得 出 一 个 更 加 清 晰 的 异 常 处 理 2 的 情 况 : 清 单 12. 细 化 的 异 常 处 理 2 Object r = null; try { r = handler.invoke(this, method, new Object[] {new Integer(arg1), new Long(arg2), arg3); catch( ExceptionA e) { // 接 口 方 法 支 持 ExceptionA, 可 以 抛 出 throw e; catch( ExceptionB e ) { // 接 口 方 法 支 持 ExceptionB, 可 以 抛 出 throw e; catch(throwable e) { // 其 他 不 支 持 的 异 常, 一 律 抛 UndeclaredThrowableException throw new UndeclaredThrowableException(e); 这 样 我 们 就 完 成 了 对 动 态 代 理 类 的 推 演 实 现 推 演 实 现 遵 循 了 一 个 相 对 固 定 的 模 式, 可 以 适 用 于 任 意 定 义 的 任 何 接 口, 而 且 代 码 生 成 所 需 的 信 息 都 是 可 知 的, 那 么 有 理 由 相 信 即 使 是 机 器 自 动 编 写 的 代 码 也 有 可 能 延 续 这 样 的 风 格, 至 少 可 以 保 证 这 是 可 行 的 回 页 首 美 中 不 足 诚 然,Proxy 已 经 设 计 得 非 常 优 美, 但 是 还 是 有 一 点 点 小 小 的 遗 憾 之 处, 那 就 是 它 始 终 无 法 摆 脱 仅 支 持 interface 代 理 的 桎 梏, 因 为 它 的 设 计 注 定 了 这 个 遗 憾 回 想 一 下 那 些 动 态 生 成 的 代 理 类 的 继 承 关 系 图, 它 们 已 经 注 定 有 一 个 共 同 的 父 类 叫 Proxy Java 的 继 承 机 制 注 定 了 这 些 动 态 代 理 类 们 无 法 实 现 对 class 的 动 态 代 理, 原 因 是 多 继 承 在 Java 中 本 质 上 就 行 不 通

有 很 多 条 理 由, 人 们 可 以 否 定 对 class 代 理 的 必 要 性, 但 是 同 样 有 一 些 理 由, 相 信 支 持 class 动 态 代 理 会 更 美 好 接 口 和 类 的 划 分, 本 就 不 是 很 明 显, 只 是 到 了 Java 中 才 变 得 如 此 的 细 化 如 果 只 从 方 法 的 声 明 及 是 否 被 定 义 来 考 量, 有 一 种 两 者 的 混 合 体, 它 的 名 字 叫 抽 象 类 实 现 对 抽 象 类 的 动 态 代 理, 相 信 也 有 其 内 在 的 价 值 此 外, 还 有 一 些 历 史 遗 留 的 类, 它 们 将 因 为 没 有 实 现 任 何 接 口 而 从 此 与 动 态 代 理 永 世 无 缘 如 此 种 种, 不 得 不 说 是 一 个 小 小 的 遗 憾 但 是, 不 完 美 并 不 等 于 不 伟 大, 伟 大 是 一 种 本 质,Java 动 态 代 理 就 是 佐 例 参 考 资 料 Dynamic Proxy Classes : 查 看 Java 动 态 代 理 的 相 关 文 档 Introduction to Java Exception Handling : 介 绍 了 如 何 处 理 Java 异 常 Java 理 论 与 实 践 : 用 动 态 代 理 进 行 修 饰 (developerworks,2005 年 9 月 ): 动 态 代 理 工 具 是 java.lang.reflect 包 的 一 部 分, 在 JDK 1.3 版 本 中 添 加 到 JDK, 它 允 许 程 序 创 建 代 理 对 象 本 文 中, 作 者 介 绍 了 几 个 用 于 动 态 代 理 的 应 用 程 序 利 用 动 态 代 理 的 Java 验 证 (developerworks,2004 年 9 月 ): 本 文 向 您 展 示 动 态 代 理 如 何 让 核 心 应 用 程 序 代 码 独 立 于 验 证 例 程, 而 只 关 注 业 务 逻 辑 developerworks Java 技 术 专 区 : 数 百 篇 关 于 Java 编 程 各 个 方 面 的 文 章