Class.forName和ClassLoader.loadClass在类加载时有何不同?
Class.forName()
和ClassLoader
都是用于加载类的,但它们之间存在一些重要的差异:
- 初始化:
Class.forName()
加载类时,不仅会将类的.class文件加载到内存中,而且会对类进行初始化,即执行类的静态代码块。而ClassLoader
(更准确地说是ClassLoader.loadClass()
方法)加载类时,只会将.class文件加载到内存中,而不会执行类的静态代码块,除非调用Class
对象的newInstance()
方法创建对象。 -
使用:
Class.forName()
是一个静态方法,它使用的是调用者的类加载器加载类。而ClassLoader
通常需要创建实例后才能使用,且可以自定义类加载器。 -
应用场景:
Class.forName()
常用于加载JDBC驱动,因为JDBC驱动需要在加载时进行自我注册。ClassLoader
常用于动态加载类或者应用服务器中,用于隔离加载应用程序。
例如,以下是使用Class.forName()
加载并初始化类的示例:
try {
Class<?> aClass = Class.forName("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
以下是使用ClassLoader.loadClass()
加载类但不初始化的示例:
try {
Class<?> aClass = CustomClassLoader.class.getClassLoader().loadClass("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}