3.2.1 forName
基础
截止目前,获取 class
对象有三种方法:
object.getClass()
方法,获取 对象 的class
对象。className.class
获取 指定类 的class
对象。Class.forName(className)
方法,获取指定 全限定类名 的class
对象。
第2、3种方法比较类似,都是通过 类名 获取,但存在重要区别:
className.class
中的className
必须是在 编译时 确定的类的名字,.class
是其 属性。forName(className)
中的className
是 字符串,在运行时确定即可。
下面代码用于获取 dbClassName
指定类的 class
对象:
Class cls = Class.forName( dbClassName );
dbClassName
是 字符串 表示的 全限定类名,从配置文件中读取,直到 运行时 才能获取,所以我们可以通过 修改配置文件 改变 dbClassName
指定的具体类,从而改变动态加载的 class
对象,最后改变反射构造的实际 Facade
实现类的对象。
forName
的作用:加载指定类,并返回 class
对象的引用。
forName
的行为是通过类加载器完成的,通常即为Class.forName
中,加载Class
对象的类加载器。- 若指定类 已经被加载,再不会重复加载,而是直接返回对应引用。
- 若指定类 未被加载:
- 类加载器搜索
classpath
路径,寻找合适的.class
文件。 - 如果找到,则读取
.class
文件中的 字节码,并根据字节码构造class
对象。 - 若未找到,则抛出
ClassNotFoundException
。
- 类加载器搜索