java基础加强课件.ppt

上传人:小** 文档编号:23694102 上传时间:2021-06-10 格式:PPT 页数:66 大小:638KB
返回 下载 相关 举报
java基础加强课件.ppt_第1页
第1页 / 共66页
java基础加强课件.ppt_第2页
第2页 / 共66页
java基础加强课件.ppt_第3页
第3页 / 共66页
点击查看更多>>
资源描述
高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 Java基 础 加 强讲 师 : 张 孝 祥 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 预 备l 发 就 业 面 试 宝 典l 提 示 大 家 一 定 要 学 会 记 录 和 整 理 课 堂 笔 记l 安 装 Myeclipse和 插 件 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 课 程 大 纲l eclipse的 使 用 技 巧l 静 态 导 入l 可 变 参 数 与 for循 环 增 强l 基 本 数 据 类 型 的 自 动 拆 箱 与 装 箱l 枚 举l 反 射l JavaBean内 省 l beanutils工 具 包l 注 解l 泛 型l 类 加 载 器l 代 理l 线 程 并 发 库 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 eclipse的 使 用 技 巧l Workspace与 project必 须 要 求 : 会 切 换 工 作 间 与 导 入 项 目l Perspective与 viewl 设 置 整 个 workspace的 javac与 java。l 设 置 单 个 工 程 的 javac与 java。高 版 本 的 java能 否 运 行 低 版 本 的 javac编 译 的 程 序 ?低 版 本 的 java能 否 运 行 高 版 本 的 javac编 译 的 程 序 ?l 快 捷 键 的 绑 定 与 代 码 模 板l 利 用 快 捷 键 提 高 工 作 效 率在 应 用 中 具 体 举 例 讲 解 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 静 态 导 入l import语 句 可 以 导 入 一 个 类 或 某 个 包中 的 所 有 类l import static语 句 导 入 一 个 类 中 的 某 个静 态 方 法 或 所 有 静 态 方 法l 语 法 举 例 : import static java.lang.Math.sin;import static java.lang.Math.*; 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 可 变 参 数l 问 题 : 一 个 方 法 接 受 的 参 数 个 数 不 固 定 , 例如 : System.out.println(countScore(2,3,5);System.out.println(countScore(1,2,3,5);l 可 变 参 数 的 特 点 :只 能 出 现 在 参 数 列 表 的 最 后 ; 这 个 要 记 住.位 于 变 量 类 型 和 变 量 名 之 间 , 前 后 有 无 空 格 都 可 以 ;调 用 可 变 参 数 的 方 法 时 , 编 译 器 为 该 可 变 参 数 隐 含 创 建一 个 数 组 , 在 方 法 体 中 以 数 组 的 形 式 访 问 可 变 参 数 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 增 强 for循 环l 语 法 :for ( type 变 量 名 : 集 合 变 量 名 ) l 注 意 事 项 :迭 代 变 量 必 须 在 ( )中 定 义 !集 合 变 量 可 以 是 数 组 或 实 现 了 Iterable接 口 的 集 合 类l 举 例 : public static int add(int x,int .args) int sum = x;for(int arg:args) sum += arg; return sum; 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 基 本 数 据 类 型 的 自 动 拆 箱 与 装 箱l 自 动 装 箱 :Integer num1 = 12;l 自 动 拆 箱 :System.out.println(num1 + 12);l 基 本 数 据 类 型 的 对 象 缓 存 :Integer num1 = 12;Integer num2 = 12; 这 块 相 等 , class文 件 -内 存 中 的字 节 码 。 思 考 : Override、 SuppressWarnings和 Deprecated这 三 个 注 解 的 属 性 值 分 别 是 什么 ?l 演 示 和 讲 解 Target元 注 解 Target的 默 认 值 为 任 何 元 素 , 设 置 Target等 于 ElementType.METHOD, 原 来 加 在 类 上 的 注解 就 报 错 了 , 改 为 用 数 组 方 式 设 置 ElementType.METHOD,ElementType.TYPE就 可 以 了 。 l 元 注 解 以 及 其 枚 举 属 性 值 不 用 记 , 只 要 会 看 jdk提 供 那 几 个 基 本 注 解 的 API帮 助 文 档 的 定 义 或 其 源 代 码 , 按 图 索 骥 即 可 查 到 , 或 者 直 接 看java.lang.annotation包 下 面 的 类 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 为 注 解 增 加 基 本 属 性l 什 么 是 注 解 的 属 性 一 个 注 解 相 当 于 一 个 胸 牌 , 如 果 你 胸 前 贴 了 胸 牌 , 就 是 传 智 播 客 的 学 生 , 否 则 , 就 不 是 。 如 果 还想 区 分 出 是 传 智 播 客 哪 个 班 的 学 生 , 这 时 候 可 以 为 胸 牌 在 增 加 一 个 属 性 来 进 行 区 分 。 加 了 属 性 的标 记 效 果 为 : MyAnnotation(color=red)l 定 义 基 本 类 型 的 属 性 和 应 用 属 性 : 在 注 解 类 中 增 加 String color(); MyAnnotation(color=red)l 用 反 射 方 式 获 得 注 解 对 应 的 实 例 对 象 后 , 再 通 过 该 对 象 调 用 属 性 对 应 的 方 法 MyAnnotation a = (MyAnnotation)AnnotationTest.class.getAnnotation(MyAnnotation.class); System.out.println(a.color(); 可 以 认 为 上 面 这 个 MyAnnotation是 MyAnnotaion类 的 一 个 实 例 对 象 l 为 属 性 指 定 缺 省 值 : String color() default yellow;l value属 性 : String value() default zxx; 如 果 注 解 中 有 一 个 名 称 为 value的 属 性 , 且 你 只 想 设 置 value属 性 ( 即 其 他 属 性 都 采 用 默 认 值 或 者你 只 有 一 个 value属 性 ) , 那 么 可 以 省 略 value=部 分 , 例 如 : MyAnnotation(lhm)。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 为 注 解 增 加 高 级 属 性l 数 组 类 型 的 属 性int arrayAttr() default 1,2,3;MyAnnotation(arrayAttr=2,3,4)如 果 数 组 属 性 中 只 有 一 个 元 素 , 这 时 候 属 性 值 部 分 可 以 省 略 大 括l 枚 举 类 型 的 属 性EnumTest.TrafficLamp lamp() ;MyAnnotation(lamp=EnumTest.TrafficLamp.GREEN)l 注 解 类 型 的 属 性 :MetaAnnotation annotationAttr() default MetaAnnotation(xxxx);MyAnnotation(annotationAttr=MetaAnnotation(“yyy”) )可 以 认 为 上 面 这 个 MyAnnotation是 MyAnnotaion类 的 一 个 实 例 对 象 , 同 样 的 道 理 ,可 以 认 为 上 面 这 个 MetaAnnotation是 MetaAnnotation类 的 一 个 实 例 对 象 , 调 用 代码 如 下 : MetaAnnotation ma = myAnnotation.annotationAttr();System.out.println(ma.value();l 注 解 的 详 细 语 法 可 以 通 过 看 java语 言 规 范 了 解 , 即 看 java的 language specification。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 体 验 泛 型l Jdk 1.5以 前 的 集 合 类 中 存 在 什 么 问 题ArrayList collection = new ArrayList();collection.add(1);collection.add(1L);collection.add(abc);int i = (Integer) collection.get(1);/编 译 要 强 制 类 型 转 换 且 运 行 时 出 错 !l Jdk 1.5的 集 合 类 希 望 你 在 定 义 集 合 时 , 明 确 表 示 你 要 向 集 合 中 装 哪 种 类 型 的 数 据 ,无 法 加 入 指 定 类 型 以 外 的 数 据ArrayList collection2 = new ArrayList();collection2.add(1);/*collection2.add(1L);collection2.add(“abc”);*/这 两 行 代 码 编 译 时 就 报 告 了 语 法 错 误 int i2 = collection2.get(0);/不 需 要 再 进 行 类 型 转 换l 泛 型 是 提 供 给 javac编 译 器 使 用 的 , 可 以 限 定 集 合 中 的 输 入 类 型 , 让 编 译 器 挡 住 源 程序 中 的 非 法 输 入 , 编 译 器 编 译 带 类 型 说 明 的 集 合 时 会 去 除 掉 “ 类 型 ” 信 息 , 使 程 序运 行 效 率 不 受 影 响 , 对 于 参 数 化 的 泛 型 类 型 , getClass()方 法 的 返 回 值 和 原 始 类 型完 全 一 样 。 由 于 编 译 生 成 的 字 节 码 会 去 掉 泛 型 的 类 型 信 息 , 只 要 能 跳 过 编 译 器 , 就可 以 往 某 个 泛 型 集 合 中 加 入 其 它 类 型 的 数 据 , 例 如 , 用 反 射 得 到 集 合 , 再 调 用 其add方 法 即 可 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 了 解 泛 型l ArrayList类 定 义 和 ArrayList类 引 用 中 涉 及 如 下 术 语 : 整 个 称 为 ArrayList泛 型 类 型 ArrayList中 的 E称 为 类 型 变 量 或 类 型 参 数 整 个 ArrayList称 为 参 数 化 的 类 型 ArrayList中 的 Integer称 为 类 型 参 数 的 实 例 或 实 际 类 型 参 数 ArrayList中 的 念 着 typeof ArrayList称 为 原 始 类 型l 参 数 化 类 型 与 原 始 类 型 的 兼 容 性 : 参 数 化 类 型 可 以 引 用 一 个 原 始 类 型 的 对 象 , 编 译 报 告 警 告 , 例 如 ,Collection c = new Vector();/可 不 可 以 , 不 就 是 编 译 器 一 句 话 的 事 吗 ? 原 始 类 型 可 以 引 用 一 个 参 数 化 类 型 的 对 象 , 编 译 报 告 警 告 , 例 如 ,Collection c = new Vector();/原 来 的 方 法 接 受 一 个 集 合 参 数 , 新 的 类 型 也 要 能 传 进 去 l 参 数 化 类 型 不 考 虑 类 型 参 数 的 继 承 关 系 : Vector v = new Vector(); /错 误 !/不 写 没 错 , 写 了 就 是 明 知 故 犯 Vector v = new Vector(); /也 错 误 !l 编 译 器 不 允 许 创 建 泛 型 变 量 的 数 组 。 即 在 创 建 数 组 实 例 时 , 数 组 的 元 素 不能 使 用 参 数 化 的 类 型 , 例 如 , 下 面 语 句 有 错 误 : Vector vectorList = new Vector10;l 思 考 题 : 下 面 的 代 码 会 报 错 误 吗 ?Vector v1 = new Vector(); Vector v = v1; 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 泛 型 中 的 ? 通 配 符l 问 题 : 定 义 一 个 方 法 , 该 方 法 用 于 打 印 出 任 意 参 数 化 类 型 的 集 合 中 的 所 有 数 据 , 该 方 法 如 何 定 义 呢 ?l 错 误 方 式 :public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);/* cols.add(string);/没 错 cols = new HashSet();/会 报 告 错 误 ! */l 正 确 方 式 :public static void printCollection(Collection cols) for(Object obj:cols) System.out.println(obj);/cols.add(string);/错 误 , 因 为 它 不 知 自 己 未 来 匹 配 就 一 定 是 Stringcols.size();/没 错 , 此 方 法 与 类 型 参 数 没 有 关 系 cols = new HashSet();l 总 结 : 使 用 ?通 配 符 可 以 引 用 其 他 各 种 参 数 化 的 类 型 , ?通 配 符 定 义 的 变 量 主 要 用 作 引 用 , 可 以 调 用 与 参 数 化 无关 的 方 法 , 不 能 调 用 与 参 数 化 有 关 的 方 法 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 泛 型 中 的 ? 通 配 符 的 扩 展l 限 定 通 配 符 的 上 边 界 : 正 确 : Vector x = new Vector(); 错 误 : Vector x = new Vector();l 限 定 通 配 符 的 下 边 界 : 正 确 : Vector x = new Vector(); 错 误 : Vector x = new Vector();l 提 示 : 限 定 通 配 符 总 是 包 括 自 己 。 ?只 能 用 作 引 用 , 不 能 用 它 去 给 其 他 变 量 赋 值 Vector y = new Vector();Vector x = y;上 面 的 代 码 错 误 , 原 理 与 Vector x11 = new Vector();相 似 ,只 能 通 过 强 制 类 型 转 换 方 式 来 赋 值 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 泛 型 集 合 类 的 综 合 案 例l 能 写 出 下 面 的 代 码 即 代 表 掌 握 了 Java的 泛 型 集 合 类 : HashMap hm = new HashMap(); hm.put(zxx,19); hm.put(lis,18); SetMap.Entry mes= hm.entrySet(); for(Map.Entry me : mes) System.out.println(me.getKey() + : + me.getValue(); l 对 在 jsp页 面 中 也 经 常 要 对 Set或 Map集 合 进 行 迭 代 :$entry.key:$entry.value 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 定 义 泛 型 方 法l Java的 泛 型 方 法 没 有 C+模 板 函 数 功 能 强 大 , java中 的 如 下 代 码 无 法 通 过 编 译 : T add(T x,T y) return (T) (x+y);/return null; 用 于 放 置 泛 型 的 类 型 参 数 的 尖 括 号 应 出 现 在 方 法 的 其 他 所 有 修 饰 符 之 后 和 在 方 法 的 返 回 类 型 之 前 , 也 就 是 紧 邻 返 回值 之 前 。 按 照 惯 例 , 类 型 参 数 通 常 用 单 个 大 写 字 母 表 示 。l 交 换 数 组 中 的 两 个 元 素 的 位 置 的 泛 型 方 法 语 法 定 义 如 下 :static void swap(E a, int i, int j) E t = ai;ai = aj;aj = t; /或 用 一 个 面 试 题 讲 : 把 一 个 数 组 中 的 元 素 的 顺 序 颠 倒 一 下l 只 有 引 用 类 型 才 能 作 为 泛 型 方 法 的 实 际 参 数 , swap(new int3,3,5);语 句 会 报 告 编 译 错 误 。l 除 了 在 应 用 泛 型 时 可 以 使 用 extends限 定 符 , 在 定 义 泛 型 时 也 可 以 使 用 extends限 定 符 , 例 如 ,Class.getAnnotation()方 法 的 定 义 。 并 且 可 以 用 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 泛 型 方 法 的 练 习 题l 编 写 一 个 泛 型 方 法 , 自 动 将 Object类 型 的 对 象 转 换 成 其 他 类 型 。l 定 义 一 个 方 法 , 可 以 将 任 意 类 型 的 数 组 中 的 所 有 元 素 填 充 为 相 应类 型 的 某 个 对 象 。l 采 用 自 定 泛 型 方 法 的 方 式 打 印 出 任 意 参 数 化 类 型 的 集 合 中 的 所 有内 容 。在 这 种 情 况 下 , 前 面 的 通 配 符 方 案 要 比 范 型 方 法 更 有 效 , 当 一 个 类 型 变量 用 来 表 达 两 个 参 数 之 间 或 者 参 数 和 返 回 值 之 间 的 关 系 时 , 即 同 一 个 类型 变 量 在 方 法 签 名 的 两 处 被 使 用 , 或 者 类 型 变 量 在 方 法 体 代 码 中 也 被 使用 而 不 是 仅 在 签 名 的 时 候 使 用 , 才 需 要 使 用 范 型 方 法 。l 定 义 一 个 方 法 , 把 任 意 参 数 类 型 的 集 合 中 的 数 据 安 全 地 复 制 到 相应 类 型 的 数 组 中 。 l 定 义 一 个 方 法 , 把 任 意 参 数 类 型 的 一 个 数 组 中 的 数 据 安 全 地 复 制到 相 应 类 型 的 另 一 个 数 组 中 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 类 型 参 数 的 类 型 推 断l 编 译 器 判 断 范 型 方 法 的 实 际 类 型 参 数 的 过 程 称 为 类 型 推 断 , 类 型 推 断 是 相 对 于 知 觉推 断 的 , 其 实 现 方 法 是 一 种 非 常 复 杂 的 过 程 。l 根 据 调 用 泛 型 方 法 时 实 际 传 递 的 参 数 类 型 或 返 回 值 的 类 型 来 推 断 , 具 体 规 则 如 下 : 当 某 个 类 型 变 量 只 在 整 个 参 数 列 表 中 的 所 有 参 数 和 返 回 值 中 的 一 处 被 应 用 了 , 那 么 根 据 调 用 方 法 时 该 处的 实 际 应 用 类 型 来 确 定 , 这 很 容 易 凭 着 感 觉 推 断 出 来 , 即 直 接 根 据 调 用 方 法 时 传 递 的 参 数 类 型 或 返 回 值来 决 定 泛 型 参 数 的 类 型 , 例 如 : swap(new String3,3,4) static void swap(E a, int i, int j) 当 某 个 类 型 变 量 在 整 个 参 数 列 表 中 的 所 有 参 数 和 返 回 值 中 的 多 处 被 应 用 了 , 如 果 调 用 方 法 时 这 多 处 的 实际 应 用 类 型 都 对 应 同 一 种 类 型 来 确 定 , 这 很 容 易 凭 着 感 觉 推 断 出 来 , 例 如 : add(3,5) static T add(T a, T b) 当 某 个 类 型 变 量 在 整 个 参 数 列 表 中 的 所 有 参 数 和 返 回 值 中 的 多 处 被 应 用 了 , 如 果 调 用 方 法 时 这 多 处 的 实际 应 用 类 型 对 应 到 了 不 同 的 类 型 , 且 没 有 使 用 返 回 值 , 这 时 候 取 多 个 参 数 中 的 最 大 交 集 类 型 , 例 如 , 下面 语 句 实 际 对 应 的 类 型 就 是 Number了 , 编 译 没 问 题 , 只 是 运 行 时 出 问 题 : fill(new Integer3,3.5f) static void fill(T a, T v) 当 某 个 类 型 变 量 在 整 个 参 数 列 表 中 的 所 有 参 数 和 返 回 值 中 的 多 处 被 应 用 了 , 如 果 调 用 方 法 时 这 多 处 的 实际 应 用 类 型 对 应 到 了 不 同 的 类 型 , 并 且 使 用 返 回 值 , 这 时 候 优 先 考 虑 返 回 值 的 类 型 , 例 如 , 下 面 语 句 实际 对 应 的 类 型 就 是 Integer了 , 编 译 将 报 告 错 误 , 将 变 量 x的 类 型 改 为 float, 对 比 eclipse报 告 的 错 误 提 示 ,接 着 再 将 变 量 x类 型 改 为 Number, 则 没 有 了 错 误 : int x =(3,3.5f) static T add(T a, T b) 参 数 类 型 的 类 型 推 断 具 有 传 递 性 , 下 面 第 一 种 情 况 推 断 实 际 参 数 类 型 为 Object, 编 译 没 有 问 题 , 而 第 二 种情 况 则 根 据 参 数 化 的 Vector类 实 例 将 类 型 变 量 直 接 确 定 为 String类 型 , 编 译 将 出 现 问 题 :copy(new Integer5,new String5) static void copy(T a,T b);copy(new Vector(), new Integer5) static void copy(Collection a , T b); 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 定 义 泛 型 类 型l 如 果 类 的 实 例 对 象 中 的 多 处 都 要 用 到 同 一 个 泛 型 参 数 , 即 这 些 地 方 引 用 的 泛 型 类 型 要 保 持 同一 个 实 际 类 型 时 , 这 时 候 就 要 采 用 泛 型 类 型 的 方 式 进 行 定 义 , 也 就 是 类 级 别 的 泛 型 , 语 法 格式 如 下 :public class GenericDao private T field1;public void save(T obj)public T getById(int id)l 类 级 别 的 泛 型 是 根 据 引 用 该 类 名 时 指 定 的 类 型 信 息 来 参 数 化 类 型 变 量 的 , 例 如 , 如 下 两 种 方 式都 可 以 : GenericDao dao = null; new genericDao();l 注 意 : 在 对 泛 型 类 型 进 行 参 数 化 时 , 类 型 参 数 的 实 例 必 须 是 引 用 类 型 , 不 能 是 基 本 类 型 。 当 一 个 变 量 被 声 明 为 泛 型 时 , 只 能 被 实 例 变 量 、 方 法 和 内 部 类 调 用 , 而 不 能 被 静 态 变 量 和 静 态 方法 调 用 。 因 为 静 态 成 员 是 被 所 有 参 数 化 的 类 所 共 享 的 , 所 以 静 态 成 员 不 应 该 有 类 级 别 的 类 型 参 数 。l 问 题 : 类 中 只 有 一 个 方 法 需 要 使 用 泛 型 , 是 使 用 类 级 别 的 泛 型 , 还 是 使 用 方 法 级 别 的 泛 型 ? 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 泛 型 的 继 承l 继 承 时 , 对 泛 型 父 类 的 类 型 参 数 不 实 例 化代 码 l 继 承 时 , 对 泛 型 父 类 的 类 型 参 数 实 例 化代 码 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 通 过 反 射 获 得 泛 型 的 参 数 化 类 型l 示 例 代 码 :Class GenericalReflection private Vector dates = new Vector(); public void setDates(Vector dates) this.dates = dates; public static void main(String args) Method methodApply = GenericalReflection.class.getDeclaredMethod(applyGeneric, Vector.class); ParameterizedType pType = (ParameterizedType) (methodApply .getGenericParameterTypes()0; System.out.println(setDates( + (Class) pType.getRawType().getName() + ) ); l 泛 型 DAO的 应 用 : public abstract class DaoBaseImpl implements DaoBase protected Class clazz;public DaoBaseImpl() Type type = this.getClass().getGenericSuperclass();ParameterizedType pt = (ParameterizedType) type;this.clazz = (Class) pt.getActualTypeArguments()0;System.out.println(clazz = + this.clazz); public class ArticleDaoImpl extends DaoBaseImpl implements ArticleDao 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 类 加 载 器l 简 要 介 绍 什 么 是 类 加 载 器 和 类 加 载 器 的 作 用l Java虚 拟 机 中 可 以 安 装 多 个 类 加 载 器 , 系 统 默 认 三 个 主 要类 加 载 器 , 每 个 类 负 责 加 载 特 定 位 置 的 类 :BootStrap,ExtClassLoader,AppClassLoaderl 类 加 载 器 也 是 Java类 , 因 为 其 他 是 java类 的 类 加 载 器 本 身也 要 被 类 加 载 器 加 载 , 显 然 必 须 有 第 一 个 类 加 载 器 不 是 不是 java类 , 这 正 是 BootStrap。l Java虚 拟 机 中 的 所 有 类 装 载 器 采 用 具 有 父 子 关 系 的 树 形 结构 进 行 组 织 , 在 实 例 化 每 个 类 装 载 器 对 象 时 , 需 要 为 其 指定 一 个 父 级 类 装 载 器 对 象 或 者 默 认 采 用 系 统 类 装 载 器 为 其父 级 类 加 载 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 类 加 载 器 之 间 的 父 子 关 系 和 管 辖 范 围 图BootStrapExtClassLoaderAppClassLoaderItcastClassLoaderMyClassLoaderSystemclassLoader JRE/lib/rt.jarJRE/lib/ext/*.jarCLASSPATH指 定 的所 有 jar或 目 录传 智 播 客 指 定 的特 殊 目 录 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 类 加 载 器 的 委 托 机 制l 当 Java虚 拟 机 要 加 载 一 个 类 时 , 到 底 派 出 哪 个 类 加 载 器 去 加 载 呢 ?首 先 当 前 线 程 的 类 加 载 器 去 加 载 线 程 中 的 第 一 个 类 。如 果 类 A中 引 用 了 类 B, Java虚 拟 机 将 使 用 加 载 类 A的 类 装 载 器 来 加 载 类B。 还 可 以 直 接 调 用 ClassLoader.loadClass()方 法 来 指 定 某 个 类 加 载 器 去 加载 某 个 类 。l 每 个 类 加 载 器 加 载 类 时 , 又 先 委 托 给 其 上 级 类 加 载 器 。当 所 有 祖 宗 类 加 载 器 没 有 加 载 到 类 , 回 到 发 起 者 类 加 载 器 , 还 加 载 不 了 ,则 抛 ClassNotFoundException, 不 是 再 去 找 发 起 者 类 加 载 器 的 儿 子 , 因为 没 有 getChild方 法 , 即 使 有 , 那 有 多 个 儿 子 , 找 哪 一 个 呢 ?对 着 类 加 载 器 的 层 次 结 构 图 和 委 托 加 载 原 理 , 解 释 先 前 将ClassLoaderTest输 出 成 jre/lib/ext目 录 下 的 itcast.jar包 中 后 , 运 行 结 果 为ExtClassLoader的 原 因 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 编 写 自 己 的 类 加 载 器l 知 识 讲 解 : 自 定 义 的 类 加 载 器 的 必 须 继 承 ClassLoader loadClass方 法 与 findClass方 法 defineClass方 法l 编 程 步 骤 : 编 写 一 个 对 文 件 内 容 进 行 简 单 加 密 的 程 序 。 编 写 了 一 个 自 己 的 类 装 载 器 , 可 实 现 对 加 密 过 的 类 进 行 装 载 和 解 密 。 编 写 一 个 程 序 调 用 类 加 载 器 加 载 类 , 在 源 程 序 中 不 能 用 该 类 名 定 义 引 用 变 量 , 因 为 编译 器 无 法 识 别 这 个 类 。 程 序 中 可 以 除 了 使 用 ClassLoader.load方 法 之 外 , 还 可 以 使 用设 置 线 程 的 上 下 文 类 加 载 器 或 者 系 统 类 加 载 器 , 然 后 再 使 用 Class.forName。l 实 验 步 骤 : 对 不 带 包 名 的 class文 件 进 行 加 密 , 加 密 结 果 存 放 到 另 外 一 个 目 录 , 例 如 : java MyClassLoader MyTest.class F:itcast 运 行 加 载 类 的 程 序 , 结 果 能 够 被 正 常 加 载 , 但 打 印 出 来 的 类 装 载 器 名 称 为AppClassLoader: java MyClassLoader MyTest F:itcast 用 加 密 后 的 类 文 件 替 换 CLASSPATH环 境 下 的 类 文 件 , 再 执 行 上 一 步 操 作 就 出 问 题 了 ,错 误 说 明 是 AppClassLoader类 装 载 器 装 载 失 败 。 删 除 CLASSPATH环 境 下 的 类 文 件 , 再 执 行 上 一 步 操 作 就 没 问 题 了 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 一 个 类 加 载 器 的 高 级 问 题 分 析l 编 写 一 个 能 打 印 出 自 己 的 类 加 载 器 名 称 和 当 前 类 加 载 器 的 父 子 结 构 关 系 链 的MyServlet, 正 常 发 布 后 , 看 到 打 印 结 果 为 WebAppClassloader。l 把 MyServlet.class文 件 打 jar包 , 放 到 ext目 录 中 , 重 启 tomcat, 发 现 找 不 到HttpServlet的 错 误 。l 把 servlet.jar也 放 到 ext目 录 中 , 问 题 解 决 了 , 打 印 的 结 果 是 ExtclassLoader 。l 父 级 类 加 载 器 加 载 的 类 无 法 引 用 只 能 被 子 级 类 加 载 器 加 载 的 类 , 原 理 如 下 图 :ExtClassLoaderWebAppClassLoader MyServlet HttpServlet加 载 失 败能 够 加 载 思 考 : 在 两 种 情 况 下 ,HttpServlet分 别 由 谁 加载 ? 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 代 理 的 概 念 与 作 用l 生 活 中 的 代 理武 汉 人 从 武 汉 的 代 理 商 手 中 买 联 想 电 脑 和 直 接 跑 到 北 京 传 智 播 客 旁 边 来找 联 想 总 部 买 电 脑 , 你 觉 得 最 终 的 主 体 业 务 目 标 有 什 么 区 别 吗 ? 基 本 上一 样 吧 , 都 解 决 了 核 心 问 题 , 但 是 , 一 点 区 别 都 没 有 吗 ? 从 代 理 商 那 里买 真 的 一 点 好 处 都 没 有 吗 ?l 程 序 中 的 代 理要 为 已 存 在 的 多 个 具 有 相 同 接 口 的 目 标 类 的 各 个 方 法 增 加 一 些 系 统 功 能 ,例 如 , 异 常 处 理 、 日 志 、 计 算 方 法 的 运 行 时 间 、 事 务 管 理 、 等 等 , 你 准备 如 何 做 ?编 写 一 个 与 目 标 类 具 有 相 同 接 口 的 代 理 类 , 代 理 类 的 每 个 方 法 调 用 目 标类 的 相 同 方 法 , 并 在 调 用 方 法 时 加 上 系 统 功 能 的 代 码 。 ( 参 看 下 页 的 原理 图 )如 果 采 用 工 厂 模 式 和 配 置 文 件 的 方 式 进 行 管 理 , 则 不 需 要 修 改 客 户 端 程序 , 在 配 置 文 件 中 配 置 是 使 用 目 标 类 、 还 是 代 理 类 , 这 样 以 后 很 容 易 切换 , 譬 如 , 想 要 日 志 功 能 时 就 配 置 代 理 类 , 否 则 配 置 目 标 类 , 这 样 , 增 加 系 统 功 能 很 容 易 , 以 后 运 行 一 段 时 间 后 , 又 想 去 掉 系 统 功 能 也 很 容 易 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 代 理 架 构 图 Target目 标 类接 口doSomeThing()Proxy代 理 类Client客 户 端 调 用 程 序 doSomeThing() /前 置 系 统 功 能 代 码 目 标 对 象 .doSomeThing() /后 置 系 统 功 能 代 码 doSomeThing() /业 务 功 能 代 码 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 AOPl 系 统 中 存 在 交 叉 业 务 , 一 个 交 叉 业 务 就 是 要 切 入 到 系 统 中 的 一 个 方 面 , 如 下 所 示 : 安 全 事 务 日 志StudentService -|-|-|-CourseService -|-|-|-MiscService -|-|-|-l 用 具 体 的 程 序 代 码 描 述 交 叉 业 务 :method1 method2 method3 -切 面. . .-切 面 l 交 叉 业 务 的 编 程 问 题 即 为 面 向 方 面 的 编 程 ( Aspect oriented program ,简 称 AOP) , AOP的目 标 就 是 要 使 交 叉 业 务 模 块 化 。 可 以 采 用 将 切 面 代 码 移 动 到 原 始 方 法 的 周 围 , 这 与 直 接 在 方法 中 编 写 切 面 代 码 的 运 行 效 果 是 一 样 的 , 如 下 所 示 :-切 面func1 func2 func3 . . . -切 面l 使 用 代 理 技 术 正 好 可 以 解 决 这 种 问 题 , 代 理 是 实 现 AOP功 能 的 核 心 和 关 键 技 术 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 动 态 代 理 技 术l 要 为 系 统 中 的 各 种 接 口 的 类 增 加 代 理 功 能 , 那 将 需 要 太 多 的 代 理 类 , 全部 采 用 静 态 代 理 方 式 , 将 是 一 件 非 常 麻 烦 的 事 情 ! 写 成 百 上 千 个 代 理 类 ,是 不 是 太 累 !l JVM可 以 在 运 行 期 动 态 生 成 出 类 的 字 节 码 , 这 种 动 态 生 成 的 类 往 往 被 用作 代 理 类 , 即 动 态 代 理 类 。l JVM生 成 的 动 态 类 必 须 实 现 一 个 或 多 个 接 口 , 所 以 , JVM生 成 的 动 态 类只 能 用 作 具 有 相 同 接 口 的 目 标 类 的 代 理 。l CGLIB库 可 以 动 态 生 成 一 个 类 的 子 类 , 一 个 类 的 子 类 也 可 以 用 作 该 类 的代 理 , 所 以 , 如 果 要 为 一 个 没 有 实 现 接 口 的 类 生 成 动 态 代 理 类 , 那 么 可以 使 用 CGLIB库 。 l 代 理 类 的 各 个 方 法 中 通 常 除 了 要 调 用 目 标 的 相 应 方 法 和 对 外 返 回 目 标 返回 的 结 果 外 , 还 可 以 在 代 理 方 法 中 的 如 下 四 个 位 置 加 上 系 统 功 能 代 码 :1.在 调 用 目 标 方 法 之 前2.在 调 用 目 标 方 法 之 后3.在 调 用 目 标 方 法 前 后4.在 处 理 目 标 方 法 异 常 的 catch块 中 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 分 析 JVM动 态 生 成 的 类l 创 建 实 现 了 Collection接 口 的 动 态 类 和 查 看 其 名 称 , 分 析 Proxy.getProxyClass方 法 的 各 个 参 数 。l 编 码 列 出 动 态 类 中 的 所 有 构 造 方 法 和 参 数 签 名l 编 码 列 出 动 态 类 中 的 所 有 方 法 和 参 数 签 名l 创 建 动 态 类 的 实 例 对 象 用 反 射 获 得 构 造 方 法 编 写 一 个 最 简 单 的 InvocationHandler类 调 用 构 造 方 法 创 建 动 态 类 的 实 例 对 象 , 并 将 编 写 的 InvocationHandler类 的 实 例 对 象 传 进 去 打 印 创 建 的 对 象 和 调 用 对 象 的 没 有 返 回 值 的 方 法 和 getClass方 法 , 演 示 调 用 其 他 有 返 回 值 的 方 法 报 告 了 异常 。 将 创 建 动 态 类 的 实 例 对 象 的 代 理 改 成 匿 名 内 部 类 的 形 式 编 写 , 锻 炼 大 家 习 惯 匿 名 内 部 类 。 l 总 结 思 考 : 让 jvm创 建 动 态 类 及 其 实 例 对 象 , 需 要 给 它 提 供 哪 些 信 息 ? 三 个 方 面 : 生 成 的 类 中 有 哪 些 方 法 , 通 过 让 其 实 现 哪 些 接 口 的 方 式 进 行 告 知 ; 产 生 的 类 字 节 码 必 须 有 个 一 个 关 联 的 类 加 载 器 对 象 ; 生 成 的 类 中 的 方 法 的 代 码 是 怎 样 的 , 也 得 由 我 们 提 供 。 把 我 们 的 代 码 写 在 一 个 约 定 好 了 接 口 对 象 的方 法 中 , 把 对 象 传 给 它 , 它 调 用 我 的 方 法 , 即 相 当 于 插 入 了 我 的 代 码 。 提 供 执 行 代 码 的 对 象 就 是 那个 InvocationHandler对 象 , 它 是 在 创 建 动 态 类 的 实 例 对 象 的 构 造 方 法 时 传 递 进 去 的 。 在 上 面 的InvocationHandler对 象 的 invoke方 法 中 加 一 点 代 码 , 就 可 以 看 到 这 些 代 码 被 调 用 运 行 了 。l 用 Proxy.newInstance方 法 直 接 一 步 就 创 建 出 代 理 对 象 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 猜 想 分 析 动 态 生 成 的 类 的 内 部 代 码l 动 态 生 成 的 类 实 现 了 Collection接 口 ( 可 以 实 现 若 干 接 口 ) , 生 成 的 类 有Collection接 口 中 的 所 有 方 法 和 一 个 如 下 接 受 InvocationHandler参 数 的 构 造 方 法 。l 构 造 方 法 接 受 一 个 InvocationHandler对 象 , 接 受 对 象 了 要 干 什 么 用 呢 ? 该 方 法 内部 的 代 码 会 是 怎 样 的 呢 ?l 实 现 Collection接 口 的 动 态 类 中 的 各 个 方 法 的 代 码 又 是 怎 样 的 呢 ?InvocationHandler接 口 中 定 义 的 invoke方 法 接 受 的 三 个 参 数 又 是 什 么 意 思 ? 图 解说 明 如 下 :Client程 序 调 用 objProxy.add(“abc”)方 法 时 , 涉 及 三 要 素 : objProxy对 象 、 add方 法 、 “ abc”参 数Class Proxy$ add(Object object) return handler.invoke(Object proxy, Method method, Object args);l 分 析 先 前 打 印 动 态 类 的 实 例 对 象 时 , 结 果 为 什 么 会 是 null呢 ? 调 用 有 基 本 类 型返 回 值 的 方 法 时 为 什 么 会 出 现 NullPointerException异 常 ?l 分 析 为 什 么 动 态 类 的 实 例 对 象 的 getClass()方 法 返 回 了 正 确 结 果 呢 ? 调 用 调 用 代 理 对 象 的 从 Object类 继 承 的 hashCode, equals, 或 toString这 几 个 方 法 时 , 代 理 对 象 将 调用 请 求 转 发 给 InvocationHandler对 象 , 对 于 其 他 方 法 , 则 不 转 发 调 用 请 求 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 让 动 态 生 成 的 类 成 为 目 标 类 的 代 理l 分 析 动 态 代 理 的 工 作 原 理 图 ( 见 下 页 )l 怎 样 将 目 标 类 传 进 去 ?直 接 在 InvocationHandler实 现 类 中 创 建 目 标 类 的 实 例 对 象 , 可 以 看 运 行 效 果和 加 入 日 志 代 码 , 但 没 有 实 际 意 义 。为 InvocationHandler实 现 类 注 入 目 标 类 的 实 例 对 象 , 不 能 采 用 匿 名 内 部 类 的形 式 了 。让 匿 名 的 InvocationHandler实 现 类 访 问 外 面 方 法 中 的 目 标 类 实 例 对 象 的 final类 型 的 引 用 变 量 。l 将 创 建 代 理 的 过 程 改 为 一 种 更 优 雅 的 方 式 , eclipse重 构 出 一 个 getProxy方 法 绑 定 接 收 目 标 同 时 返 回 代 理 对 象 , 让 调 用 者 更 懒 惰 , 更 方 便 , 调 用者 甚 至 不 用 接 触 任 何 代 理 的 API。 l 将 系 统 功 能 代 码 模 块 化 , 即 将 切 面 代 码 也 改 为 通 过 参 数 形 式 提 供 , 怎 样把 要 执 行 的 系 统 功 能 代 码 以 参 数 形 式 提 供 ?把 要 执 行 的 代 码 装 到 一 个 对 象 的 某 个 方 法 里 , 然 后 把 这 个 对 象 作 为 参 数传 递 , 接 收 者 只 要 调 用 这 个 对 象 的 方 法 , 即 等 于 执 行 了 外 界 提 供 的 代 码 ! 为 bind方 法 增 加 一 个 Advice参 数 。 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 动 态 代 理 的 工 作 原 理 图 高 级 软 件 人 才 实 作 培 训 专 家 ! 北 京 传 智 播 客 教 育 实 现 AOP功 能 的 封 装 与 配 置l 工 厂 类 BeanFactory负 责 创 建 目 标 类 或 代 理 类 的 实 例 对 象 , 并 通 过 配 置文 件 实 现 切 换 。 其 getBean方 法 根 据 参 数 字 符 串 返 回 一 个 相 应 的
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!