3.1.2 实现反射解决方案
该方案实现的 关键 是 实现工厂方法,代码如下:
public class MainApplication {
private Properties properties;
private CustomerDatabase custDB;
public synchronized CustomerDatabase createDBFacade() {
if (custDB == null) {
try {
// 加载配置文件中 db.class 指定的类
String className = properties.getProperty("db.class", "com.wci.app.StubCustomerDB");
// 从字节码加载该类到 JVM
Class<?> cls = Class.forName(className);
// 动态实例化该类
custDB = (CustomerDatabase) cls.newInstance();
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e.printStackTrace();
}
}
return custDB;
}
}
java.lang.Properties用来加载配置文件,配置文件中会存储以db.class为key存储Facade接口实现类的名字(全限定名),任何人都可以通过 修改配置文件 以获取不同的数据库访问代码的实现。Class.forName方法用来加载 指定类名 的类,注意是从classpath路径找到的 字节码 加载的。