Class.forName
是 Java 反射机制中的一个重要方法,用于动态加载类。它的主要作用是通过类的全限定名(包括包名)来加载对应的类,并返回该类的 Class
对象。
1. 作用
- 动态加载类:在运行时根据类的全限定名加载类,而不是在编译时确定。
- 初始化类:默认情况下,
Class.forName
会执行类的静态代码块(即类的初始化阶段)。 - 获取类的元信息:通过返回的
Class
对象,可以获取类的构造函数、方法、字段等元信息。
2. 方法签名
public static Class<?> forName(String className) throws ClassNotFoundException
- 参数:
className
是类的全限定名(包括包名),例如java.lang.String
。 - 返回值:返回加载类的
Class
对象。 - 异常:如果类未找到,抛出
ClassNotFoundException
。
3. 使用场景
- 数据库驱动加载:在 JDBC 中,通常使用
Class.forName
动态加载数据库驱动类。 - 插件化架构:在需要动态加载外部类或插件时使用。
- 反射操作:通过
Class.forName
获取类的Class
对象后,可以使用反射机制操作类的方法、字段等。
4. 示例代码
动态加载类并初始化
public class Main {
public static void main(String[] args) {
try {
// 动态加载类并初始化
Class<?> clazz = Class.forName("java.lang.String");
System.out.println("Class loaded: " + clazz.getName());
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
加载数据库驱动
public class Main {
public static void main(String[] args) {
try {
// 加载 MySQL 驱动
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("MySQL Driver loaded successfully.");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}
5. 注意事项
- 类的初始化:
Class.forName
默认会执行类的静态代码块。如果不需要初始化,可以使用重载方法:
将Class.forName(String className, boolean initialize, ClassLoader loader)
initialize
参数设置为false
。 - 类加载器:默认使用当前类的类加载器。如果需要指定类加载器,可以使用上述重载方法。
- 性能开销:反射操作(包括
Class.forName
)比直接操作类的性能低,应避免在性能敏感的场景中过度使用。
6. 总结
Class.forName
用于动态加载类并返回其Class
对象。- 默认会初始化类(执行静态代码块)。
- 常用于 JDBC 驱动加载、插件化架构和反射操作。
- 需要注意性能开销和类的初始化行为。
THE END
暂无评论内容