前言
两者都是用来实例化对象
但具体的应用场景和表现形式却不一样
1. 功能特点
-
new:
强类型,不会自动被GC垃圾回收(生命周期结束回收)、高效率 -
newInstance:
弱类型、容易被GC垃圾回收、无参构造、低效率
可以实现IOC、反射、面向接口编程
具体两者对比
- new是实例对象而newInstance是实用类的加载机制
- new不用加载过就可用而newInstance需要加载并且有连接才可用
此处涉及GC垃圾回收可看我上一篇文章
Jvm从入门到精通(全)
此处重点讲解newInstance
newInstance实例化对象是只能调用无参构造方法
接口类实现类没有构造方法,系统默认会配置无参构造,如果接口实现类有有参构造函数,则必须重写一个无参构造函数才可用newInstance
具体实操可看下方
2. 代码讲解
Java中工厂模式经常使用newInstance来创建对象
主要通过使用类加载器并且连接
代码为class的静态方法forName()
方法
调用class的静态加载方法forName时获得更好的
灵活性,提供给了我们降耦的手段
Class c = Class.forName(“A”);
AInterface xx = (AInterface)c.newInstance();
上述代码中 A继承了AInterface,才可执行这些代码
还可这样执行
String className = “A”;
Class c = Class.forName(className);
AInterface xx = (AInterface)c.newInstance();
具体className都是在xml中获取字符串
String className = xml配置文件名;//从xml 配置文件中获得字符串
Class c = Class.forName(className);
AInterface xx = (AInterface)c.newInstance();
通过该代码也可看出
new 和 newInstance 具有相同的作用
具体不同场景使用不同创建对象方式
3. 实战开发
通过jdbc配置文件jdbc.properties获取类名
jdbc.properties 配置文件中书写className=sql
运用反射机制,类加载文件调用对象方法
ResourceBundle bundle=ResourceBundle.getBundle("jdbc");
String className=bundle.getString("className")
Class c = Class.forName(className);
JDBC jdbc = (JDBC)c.newInstance();
//以下代码是面向接口调用方法,不需要修改
jdbc.getConnection();