gpt4 book ai didi

java - Class.forName() vs ClassLoader.loadClass() - 哪个用于动态加载?

转载 作者:IT老高 更新时间:2023-10-28 11:28:47 33 4
gpt4 key购买 nike

动态加载类的时候,什么时候用比较合适

Class.forName("SomeClass");

我应该什么时候使用

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

或者,它们是做同一件事的两种方式吗?

最佳答案

它们完全不同!

Class.forName(String) 的文档中所述,

Returns the Class object associated with the class or interface with the given string name. Invoking this method is equivalent to: Class.forName(className, true, currentLoader)

(true这里指的是你要初始化类吗?)

另一方面,ClassLoader.loadClass(String) :

Invoking this method is equivalent to invoking loadClass(name, false).

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

第一个 (Class.forName("SomeClass");) 将:

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

另一个(ClassLoader.getSystemClassLoader().loadClass("SomeClass");)会:

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

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

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

关于java - Class.forName() vs ClassLoader.loadClass() - 哪个用于动态加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8100376/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com