他们是完全不同的!
如文档中所述
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节。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)