首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Class.forName()与ClassLoader.loadClass() --哪个用于动态加载?

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

Stack Overflow用户
提问于 2011-11-12 05:45:24
回答 6查看 80.6K关注 0票数 101

当动态装入一个类时,什么时候适合使用

代码语言:javascript
复制
Class.forName("SomeClass");

我应该在什么时候使用

代码语言:javascript
复制
ClassLoader.getSystemClassLoader().loadClass("SomeClass");

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-12 05:49:20

它们完全不同!

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

返回与具有给定字符串名称的类或接口相关联的类对象。调用此方法等效于:Class.forName(className, true, currentLoader)

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

另一方面,ClassLoader.loadClass(String)

调用此方法等效于调用loadClass(name, false)

(在这里,布尔值与初始化无关;但是如果您查看loadClass(String,boolean)文档,您将看到它所做的全部工作就是加载类,而不是初始化它)。

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

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

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

JDBC

  • not初始化类(也就是说,如果您使用它来加载驱动程序,它将不会被注册,并且您将无法使用JDBC!)

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

有关类装载和初始化的更详细(和权威)信息,请查看最新(第3版) Java Language Specification的12.212.4部分。

票数 168
EN

Stack Overflow用户

发布于 2011-11-12 05:50:29

Class.forName()使用调用者的类加载器并初始化类(运行静态初始化器等)。

loadClass是一个ClassLoader方法,因此它使用显式提供的加载器,并延迟地初始化类(在第一次使用时)。

请注意,还有一个也接受ClassLoaderClass.forName()

票数 10
EN

Stack Overflow用户

发布于 2011-11-12 05:50:48

他们基本上都在做同样的事情。不过,使用的ClassLoader可能有所不同。Class.forName使用从this.getClass().getClassLoader()获得的ClassLoader,而您的其他代码指定使用系统类加载器。

在大多数应用程序中,这将是相同的类加载器,但在更复杂的环境中,如J2EE应用程序或applet,情况可能并非如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8100376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档