当动态装入一个类时,什么时候适合使用
Class.forName("SomeClass");我应该在什么时候使用
ClassLoader.getSystemClassLoader().loadClass("SomeClass");或者,它们是做同一件事的两种方式吗?
发布于 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");)将:
另一个(ClassLoader.getSystemClassLoader().loadClass("SomeClass");)将:
JDBC
假设您正在编写一个web应用程序,该应用程序将在Tomcat等容器上执行。Tomcat所做的是为每个web应用程序创建一个类加载器(这样它就可以在以后卸载web应用程序并释放内存--您需要一个专用的类加载器才能正常工作!)。在这种情况下,您可以看到两个调用将产生完全不同的结果!
有关类装载和初始化的更详细(和权威)信息,请查看最新(第3版) Java Language Specification的12.2和12.4部分。
发布于 2011-11-12 05:50:29
Class.forName()使用调用者的类加载器并初始化类(运行静态初始化器等)。
loadClass是一个ClassLoader方法,因此它使用显式提供的加载器,并延迟地初始化类(在第一次使用时)。
请注意,还有一个也接受ClassLoader的Class.forName()。
发布于 2011-11-12 05:50:48
他们基本上都在做同样的事情。不过,使用的ClassLoader可能有所不同。Class.forName使用从this.getClass().getClassLoader()获得的ClassLoader,而您的其他代码指定使用系统类加载器。
在大多数应用程序中,这将是相同的类加载器,但在更复杂的环境中,如J2EE应用程序或applet,情况可能并非如此。
https://stackoverflow.com/questions/8100376
复制相似问题