class.forname()用于运行时动态加载全限定名类、触发静态初始化并返回class对象;它执行类加载、链接、初始化三步,支持重载控制是否初始化,常用于jdbc驱动注册、配置化对象创建等解耦场景。

Class.forName() 是 Java 反射中最常用的动态加载类的方式,它能在运行时根据类的全限定名(如 java.util.ArrayList)加载类、触发类初始化,并返回对应的 Class 对象。
一、基本用法:加载类并获取 Class 对象
调用 Class.forName(String className) 会完成三件事:
- 查找并加载指定全限定名的类(如果尚未加载)
- 执行该类的静态初始化块(
static {})和静态字段初始化 - 返回代表该类的
Class>实例
示例:
Class> clazz = Class.forName("java.util.Date");
System.out.println(clazz); // class java.util.Date
二、注意:类名必须是全限定名(含包路径)
不能只写类名,比如 "Date" 或 "ArrayList" 会抛出 ClassNotFoundException。
正确写法:
"java.time.LocalDateTime""com.example.MyService""java.lang.String"
错误写法:
-
"LocalDateTime"(缺少包) -
"MyService"(未指定包)
三、可选:控制是否执行静态初始化
重载方法 Class.forName(String name, boolean initialize, ClassLoader loader) 允许你精细控制:
-
initialize = true:默认行为,执行静态块(等同于单参数版本) -
initialize = false:加载类但不触发静态初始化(适合只想获取类型信息、避免副作用的场景) -
loader:指定使用的类加载器(常用于插件、模块化环境)
示例(延迟初始化):
Class> clazz = Class.forName("com.example.Config", false, Thread.currentThread().getContextClassLoader());
// 此时 Config 类的 static {} 不会执行
四、常见用途与注意事项
典型使用场景:
- 数据库驱动注册(如早期 MySQL 驱动:
Class.forName("com.mysql.jdbc.Driver")) - 配置化创建对象(读取类名字符串,再用
clazz.getDeclaredConstructor().newInstance()实例化) - 框架中按需加载扩展类(如 Spring 的自定义 BeanFactoryPostProcessor)
需要注意:
- 若类不存在、不可见或初始化失败,会抛出
ClassNotFoundException或ExceptionInInitializerError - 建议用 try-catch 包裹,尤其在加载外部配置的类名时
- JDK 9+ 模块系统下,目标类需对调用模块“可读”(
requires或opens)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











