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

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

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节。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5176514.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存