栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Class.forName()与ClassLoader.loadClass()-用于动态加载的是哪个?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Class.forName()与ClassLoader.loadClass()-用于动态加载的是哪个?

他们是完全不同的!

如文档中所述

Class.forName(String)

使用给定的字符串名称返回与类或接口关联的Class对象。调用此方法等效于:

Class.forName(className, true,currentLoader)

true
这里指的 是您要初始化该类吗?

另一方面,

ClassLoader.loadClass(String)

调用此方法等效于调用

loadClass(name, false)

(在这里,布尔值与初始化无关;但是,如果查看loadClass(String,boolean)文档,您会发现它所做的只是加载类,而不是初始化类)。

第一个(

Class.forName("SomeClass");
)将:

  • 使用加载了调用此代码的类的类加载器
  • 初始化类(即,将运行所有静态初始化器)

另一个(

ClassLoader.getSystemClassLoader().loadClass("SomeClass");
)将:

  • 使用“系统”类加载器(可重写)
  • 不初始化该类(例如,如果您使用它来加载JDBC驱动程序,则该类将不会被注册,并且您将无法使用JDBC!)

假设您正在编码将在诸如Tomcat之类的容器上执行的Web应用程序。Tomcat要做的是为每个Web应用程序创建一个类加载器(以便它可以稍后卸载该Web应用程序并释放内存-
您需要专用的类加载器才能正常工作!)。在这种情况下,您可以看到两个调用将产生完全不同的结果!

有关类加载和初始化的更详细(权威)信息,请查看Java语言规范的最新(第3版)的12.2和12.4节。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/449661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号