1、Class.forName() 和 ClassLoader.loadClass()的 区 别 ?Class.forName() 和 Class.forName().NewInstance()的 区 别 ?Class.forName(“xx.xx“)等 同 于Class.forName(“xx.xx“,true,CALLClass.class.getClassLoader(),第 二 个 参 数 (bool)表 示 装 载 类 的 时 候 是 否 初 始 化 该 类 , 即 调 用 类 的 静 态块 的 语 句 及 初 始 化 静 态 成 员 变 量 。ClassLoader loader =T
2、hread.currentThread.getContextClassLoader(); /也 可 以 用(ClassLoader.getSystemClassLoader()Class cls = loader.loadClass(“xx.xx“); /这 句 话 没 有 执 行 初 始化 , 其 实 与 Class.forName(“xx.xx“, false, loader)是 一 致 的 , 只 是loader.loadClass(“xx.xx“)执 行 的 是 更 底 层 的 操 作 。只 有 执 行 cls.NewInstance()才 能 够 初 始 化 类 , 得 到 该 类
3、的 一 个 实 例 Class的 装 载 分 了 三 个 阶 段 , loading, linking和 initializing, 分 别定 义 在 The Java Language Specification的 12.2, 12.3和 12.4。Class.forName(className) 实 际 上 是 调 用 Class.forName(className,true, this.getClass().getClassLoader()。 注 意 第 二 个 参 数 , 是 指Class被 loading后 是 不 是 必 须 被 初 始 化 。ClassLoader.loadCla
4、ss(className)实 际 上 调 用 的 是ClassLoader.loadClass(name, false), 第 二 个 参 数 指 出 Class是 否 被link。区 别 就 出 来 了 。 Class.forName(className)装 载 的 class已 经 被 初 始化 , 而 ClassLoader.loadClass(className)装 载 的 class还 没 有 被link。一 般 情 况 下 , 这 两 个 方 法 效 果 一 样 , 都 能 装 载 Class。 但 如 果 程 序 依 赖于 Class是 否 被 初 始 化 , 就 必 须 用 C
5、lass.forName(name)了 。例 如 , 在 JDBC编 程 中 , 常 看 到 这 样 的 用 法 ,Class.forName(“com.mysql.jdbc.Driver“), 如 果 换 成 了getClass().getClassLoader().loadClass(“com.mysql.jdbc.Driver“),就 不 行 。为 什 么 呢 ? 打 开 com.mysql.jdbc.Driver的 源 代 码 看 看 ,/ Register ourselves with the DriverManager/static try java.sql.DriverManager.registerDriver(new Driver(); catch (SQLException E) throw new RuntimeException(“Cant register driver!“);原 来 , Driver在 static块 中 会 注 册 自 己 到 java.sql.DriverManager。 而static块 就 是 在 Class的 初 始 化 中 被 执 行 。 所 以 这 个 地 方 就 只 能 用Class.forName(className)。