Class.forName() 做什么?是否会初始化类?
查看完整题解
参考回答
直接回答
Class.forName 根据类名获取对应的 Class 对象。常用的单参数重载会尝试加载并初始化该类;带 initialize 参数的重载可以选择暂不初始化。它返回的是类型的描述对象,不等于创建了这个类的普通实例。
讲清原理
加载、连接、初始化是不同的事情。初始化会执行类初始化逻辑,例如静态字段初始化器和静态代码块。使用 Class.forName(name, false, loader) 可以表达“不因这次查找要求初始化”,但仍可能发生必要的加载与连接。
同一个类名在不同定义类加载器中可能代表不同类型,因此 name 与 loader 都有意义。历史上,JDBC 常靠 Class.forName 触发驱动注册;现代驱动通常支持服务发现,不能把手动加载驱动说成所有项目必写的一步。
例子与易错点
Class<?> type = Class.forName("java.lang.String");
System.out.println(type == String.class); // true
这不会创建一个字符串实例。找不到类可能抛 ClassNotFoundException;链接或初始化失败还可能产生其他异常或错误,不能只用“类名写错”解释所有失败。
相关题:第 36 题、第 69 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。