Class.forName(String className)用于动态加载指定全限定名的类并返回其Class对象,且默认触发类初始化(执行静态块和静态变量赋值);它区别于ClassLoader.loadClass()的关键在于初始化行为,典型应用包括JDBC驱动注册、插件化类加载等。

在 Java 中,Class.forName(String className) 是获取类的 Class 对象最常用的方式之一,它通过**类的全限定名(包名 + 类名)**动态加载并返回对应的 Class 实例。这个方法会触发类的**初始化(即执行静态代码块和静态字段赋值)**,这是它与 ClassLoader.loadClass() 的关键区别。
基本用法:传入全限定类名
必须使用类的完整包路径,例如:
Class> clazz = Class.forName("java.util.ArrayList");Class> clazz = Class.forName("com.example.MyService");
如果类不存在、类名拼写错误、或类所在的 JAR 未在 classpath 中,会抛出 ClassNotFoundException;若类存在但初始化过程出错(如静态块抛异常),则抛出 ExceptionInInitializerError。
注意:会触发类的初始化
不同于 ClassLoader.loadClass()(默认不初始化),Class.forName() 默认等价于 Class.forName(className, true, currentClassLoader),第二个参数 true 表示“需要初始化”。例如:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
class Test {
static { System.out.println("静态块执行了"); }
}
执行 Class.forName("Test") 会立即打印“静态块执行了”;而 getClassLoader().loadClass("Test") 不会。
可选重载:控制是否初始化
可以显式调用三参数版本来避免初始化:
-
Class.forName("com.example.MyClass", false, Thread.currentThread().getContextClassLoader());——false表示不初始化 - 第三个参数指定使用的类加载器,通常推荐用上下文类加载器(尤其在框架或模块化环境中)
常见使用场景
-
JDBC 驱动注册(旧式写法):
Class.forName("com.mysql.cj.jdbc.Driver");(现代 JDBC 4+ 已支持自动发现,一般不再需要) -
插件/配置化加载类:从配置文件读取类名字符串,再通过
forName加载,如Class.forName(config.getString("handler.class")) - 序列化/反序列化工具内部:根据类名字符串重建类型信息
不复杂但容易忽略细节:确保类名正确、类路径可达、并理解初始化行为对程序逻辑的影响。

















