Class.forName和ClassLoader.loadClass在类加载时有何不同?

Class.forName()ClassLoader都是用于加载类的,但它们之间存在一些重要的差异:

  1. 初始化:Class.forName()加载类时,不仅会将类的.class文件加载到内存中,而且会对类进行初始化,即执行类的静态代码块。而ClassLoader(更准确地说是ClassLoader.loadClass()方法)加载类时,只会将.class文件加载到内存中,而不会执行类的静态代码块,除非调用Class对象的newInstance()方法创建对象。

  2. 使用:Class.forName()是一个静态方法,它使用的是调用者的类加载器加载类。而ClassLoader通常需要创建实例后才能使用,且可以自定义类加载器。

  3. 应用场景: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();
}

发表评论

后才能评论