Class.forName会触发类初始化(执行static{}),ClassName.class不会;前者需处理ClassNotFoundException,后者编译期校验更安全;前者支持运行时动态加载,后者仅限编译期已知类型。

Class.forName 和类字面量(ClassName.class)都能获取 Class 对象,但它们的触发时机、安全性、适用场景完全不同。
是否触发类初始化
Class.forName("com.example.User") 会主动触发目标类的静态初始化块(static {})和静态字段赋值,这是它最显著的行为特征。比如 JDBC 驱动注册就依赖这个特性:
Class.forName("com.mysql.cj.jdbc.Driver");
而 User.class 不会触发任何初始化,只是在编译期确认类存在,运行时直接返回已加载的 Class 对象。
异常处理要求不同
Class.forName 必须显式处理 ClassNotFoundException,因为类名是字符串,可能拼错、类未在 classpath 中,或尚未被加载。
类字面量在编译期就校验类是否存在,写错会直接编译失败,运行时绝对安全,无需 try-catch。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
适用阶段与灵活性差异
Class.forName 支持运行时动态决定加载哪个类,适合配置驱动场景,例如:
– 从 properties 文件读取类名
– 根据用户输入或插件描述加载实现类
– 框架中按约定加载 SPI 实现
类字面量只能用于编译期已知的类型,无法配合字符串变量使用,但性能更高、更直观,适合类型明确、无需解耦的代码。
立即学习“Java免费学习笔记(深入)”;
泛型信息保留情况
ClassName.class 返回的是 Class
Class.forName 返回的是 Class>,丢失泛型信息,后续使用需手动强转或用 TypeToken 等方式补救。

















