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。
- 类加载器搜索