3.3.1 反射构造基础
Class.newInstance() 方法可以创建一个该 Class 对象表示的类的实例,该方法效果与使用 new 调用 无参构造函数 相同,即 X.class.newInstance() 等价于 new X()。
不同之处在于,newInstance 可以使用 forName 获取的 Class 调用,即调用 newInstance 方法的 Class 对象可以 运行时可知,而不必在 编译时 可知。
custDB = (CustomerDatabase) cls.newInstance();
- 因为
cls是通过读取配置文件,在运行时才创建的,所以只能通过newInstance来构造。 CustomerDatabase是接口,定义了应用需要的所有数据库操作服务,任何 实现了该接口的类都可以使用。- 设计模式推荐:面向接口,而非实现编程。
- 如果不适用接口,则该方案 完全无法实现,因为无法改变数据库服务的实现类。
newInstance 异常
ClassNotFoundException- 配置文件指定的类不存在。
InstantiationException- 构造函数执行失败。
IllegalAccessException- 在调用上下文中,无参构造函数 没有访问权限。