Class.forName 和 ClassLoader.loadClass 是 Java 中两种加载类的方式,它们的主要区别在于加载类的时机和对异常的处理。
1.Class.forName
- Class.forName 是一个静态方法,用于在运行时加载类。它返回一个 Class 对象,但在加载类的过程中,除了加载类本身外,还会执行类的静态代码块。
- 当使用 Class.forName(className) 时,如果 className 指定的类在类路径下找不到,或者类加载失败,将抛出 ClassNotFoundException。
- 通常,Class.forName 用于动态加载类,尤其是在配置文件或用户输入中指定类名的情况下。
try {
Class<?> myClass = Class.forName("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
2. ClassLoader.loadClass
- ClassLoader.loadClass 是一个实例方法,是由类加载器对象调用的。它不会执行类的静态代码块,只加载类而不初始化。
- 当使用 classLoader.loadClass(className) 时,如果 className 指定的类在类路径下找不到,将返回 null 而不是抛出异常。需要注意的是,虽然 loadClass 方法不会抛出 ClassNotFoundException,但如果在后续使用这个类时发现类加载失败,可能会抛出 NoClassDefFoundError 或其他类加载异常。
ClassLoader classLoader = getClass().getClassLoader();
try {
Class<?> myClass = classLoader.loadClass("com.example.MyClass");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
总的来说,主要区别在于异常的处理和类初始化的时机。`Class.forName` 在加载类的同时会执行类的静态代码块,而 `ClassLoader.loadClass` 只加载类但不进行初始化。