new关键字和newInstance()方法的区别?Class.forName()
类的加载方式不同
在执行Class.forName("a.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段。在使用newInstance()方法的时候,必须保证这个类已经加载并且已经连接了,而这可以通过Class的静态方法forName()来完成的。
使用关键字new创建一个类的时候,这个类可以没有被加载,一般也不需要该类在classpath中设定,但可能需要通过classlaoder来加载。
所调用的构造方法不尽相同
new关键字能调用任何构造方法。
newInstance()只能调用无参构造方法。
执行效率不同
new关键字是强类型的,效率相对较高。
newInstance()是弱类型的,效率相对较低。
既然使用newInstance()构造对象的地方通过new关键字也可以创建对象,为什么又会使用newInstance()来创建对象呢?
假设定义了一个接口Door,开始的时候是用木门的,定义为一个类WoodenDoor,在程序里就要这样写 Door door = new WoodenDoor() 。假设后来生活条件提高,换为自动门了,定义一个类AutoDoor,这时程序就要改写为 Door door = new AutoDoor() 。虽然只是改个标识符,如果这样的语句特别多,改动还是挺大的。于是出现了工厂模式,所有Door的实例都由DoorFactory提供,这时换一种门的时候,只需要把工厂的生产模式改一下,还是要改一点代码。
而如果使用newInstance(),则可以在不改变代码的情况下,换为另外一种Door。具体方法是把Door的具体实现类的类名放到配置文件中,通过newInstance()生成实例。这样,改变另外一种Door的时候,只改配置文件就可以了。示例代码如下:
String className = 从配置文件读取的接口的具体实现类的类名;
接口 接口简写= (接口) Class.forName(className).newInstance();
Class<?> clazz = Class.forName(properties.getProperty(Constants.MAPPER_CLASS));
ImoocMapper mapper = (ImoocMapper)clazz.newInstance();
或者
ImoocMapper mapper = (ImoocMapper)Class.forName(properties.getProperty(Constants.MAPPER_CLASS)).newInstance();
MAPPER_CLASS=com.imooc.bigdata.hadoop.hdfs.CaseIgnoreWordCountMapper
再配合依赖注入的方法,就提高了软件的可伸缩性、可扩展性。
new关键字和newInstance()方法的区别?Class.forName()相关推荐
- Java new关键字和newInstance()方法的区别
1.类的加载方式不同 在执行Class.forName("a.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段.在使用 ...
- c语言dynamic变量,C# dynamic关键字的使用方法
dynamic和var的区别: 1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字 ...
- java forname 原理_Java Class.forName()用法和newInstance()方法原理解析
Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说 ...
- new 对象和Class的getInstance()方法的区别?
from :http://blog.csdn.net/b_qxzb/article/details/47922193 创建对象时的区别 1.new 对象包括2步, 1)加载类: 2)并且实例化. 2. ...
- java new newinstance_Java中newInstance()和new()区别
一.newInstance()和new()区别: 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类: newInstance创建类是这个类必须已经加载过且已经连接,new创建类是 ...
- C#中关键字ref与out的区别(转)
C#中关键字ref与out的区别(转) 在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用 ...
- python三种导入模块的方法和区别
方法一: import modname 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了一个模块,就可以引用它的任何公共的函数.类或属性.模块可以通过这种方法来使用其它模 ...
- python基础学习——函数和方法的区别与联系
以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...
- java new class 直接调用_java中创建对象的的两种方式具体解释,一个是new一个是调用Class类的newinstance方法?...
展开全部 1.new 使用java的关键字new来创建对象实例.构造函数链中的所有构造函数都32313133353236313431303231363533e78988e69d833133333739 ...
最新文章
- 如何解决传输模式解决FTP连接问题
- 博客阅读学习笔记-目录
- sam机架和kx连线图_「声卡跳线」雅马哈UR22C/UR24C声卡设置机架直播K歌
- 第96:SVM简介与简单应用
- 字符设备驱动高级篇6——内核提供的读写寄存器接口
- pytorch中切换虚拟环境
- 3.2.7.1 替换细节
- 招聘笔试行测题之图形推理题解题思路汇总
- ug建模和草图切换_从草图到XD,为什么我要切换
- 4大MQ消息队列的比较
- 计算机硬盘容量分配,电脑磁盘分区容量大小怎么调整
- logogo.exe威金变种病毒
- 中国大学慕课python答案第七章_中国大学MOOC慕课用Python玩转数据章节测试答案...
- 为什么学python要先学linux-为什么要学习 Linux?
- 完全二叉树 满二叉树
- 2.16VINETIC需要解决的问题
- 昨日伦镍交易无效静待上海处理结果,橡胶认购大涨,印尼神油强势涨停YP新低2022.3.9
- Pyautogui 实现键盘鼠标动作
- 就业市场状况指数(LMCI)和非农数据
- 字符流(输入,输出)