类的加载方式不同
    在执行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()相关推荐

  1. Java new关键字和newInstance()方法的区别

    1.类的加载方式不同 在执行Class.forName("a.class.Name")时,JVM会在classapth中去找对应的类并加载,这时JVM会执行该类的静态代码段.在使用 ...

  2. c语言dynamic变量,C# dynamic关键字的使用方法

    dynamic和var的区别: 1.var声明一个局部变量只是一种简化语法,它要求编译器根据一个表达式推断具体的数据类型. 2.var只能用于声明方法内部的局部变量,而dynamic可用于局部变量,字 ...

  3. java forname 原理_Java Class.forName()用法和newInstance()方法原理解析

    Class.forName()主要功能 Class.forName(xxx.xx.xx)返回的是一个类, Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说 ...

  4. new 对象和Class的getInstance()方法的区别?

    from :http://blog.csdn.net/b_qxzb/article/details/47922193 创建对象时的区别 1.new 对象包括2步, 1)加载类: 2)并且实例化. 2. ...

  5. java new newinstance_Java中newInstance()和new()区别

    一.newInstance()和new()区别: 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类: newInstance创建类是这个类必须已经加载过且已经连接,new创建类是 ...

  6. C#中关键字ref与out的区别(转)

    C#中关键字ref与out的区别(转) 在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用 ...

  7. python三种导入模块的方法和区别

    方法一: import modname 模块是指一个可以交互使用,或者从另一Python 程序访问的代码段.只要导入了一个模块,就可以引用它的任何公共的函数.类或属性.模块可以通过这种方法来使用其它模 ...

  8. python基础学习——函数和方法的区别与联系

    以下是综合多家说法的个人理解总结,仅为做到理解它们的区别与联系,不保证严谨. 函数 函数是封装了一些独立的功能,可以直接调用,python内置了许多函数,同时可以自建函数来使用. 独立的函数是函数(像 ...

  9. java new class 直接调用_java中创建对象的的两种方式具体解释,一个是new一个是调用Class类的newinstance方法?...

    展开全部 1.new 使用java的关键字new来创建对象实例.构造函数链中的所有构造函数都32313133353236313431303231363533e78988e69d833133333739 ...

最新文章

  1. 如何解决传输模式解决FTP连接问题
  2. 博客阅读学习笔记-目录
  3. sam机架和kx连线图_「声卡跳线」雅马哈UR22C/UR24C声卡设置机架直播K歌
  4. 第96:SVM简介与简单应用
  5. 字符设备驱动高级篇6——内核提供的读写寄存器接口
  6. pytorch中切换虚拟环境
  7. 3.2.7.1 替换细节
  8. 招聘笔试行测题之图形推理题解题思路汇总
  9. ug建模和草图切换_从草图到XD,为什么我要切换
  10. 4大MQ消息队列的比较
  11. 计算机硬盘容量分配,电脑磁盘分区容量大小怎么调整
  12. logogo.exe威金变种病毒
  13. 中国大学慕课python答案第七章_中国大学MOOC慕课用Python玩转数据章节测试答案...
  14. 为什么学python要先学linux-为什么要学习 Linux?
  15. 完全二叉树 满二叉树
  16. 2.16VINETIC需要解决的问题
  17. 昨日伦镍交易无效静待上海处理结果,橡胶认购大涨,印尼神油强势涨停YP新低2022.3.9
  18. Pyautogui 实现键盘鼠标动作
  19. 就业市场状况指数(LMCI)和非农数据
  20. 字符流(输入,输出)

热门文章

  1. JEECG 命名规范
  2. SpringCloud微服务:Ribbon和Feign组件,实现服务调用的负载均衡
  3. JavaScript六种继承方式的递进推演
  4. RaySSH文件传输加速介绍!
  5. C语言对结构体何时用- , 何时用.
  6. maven的Windows环境下安装配置
  7. Red Hat 6.5安装Oracle 10g故障汇总
  8. iptables控制较复杂案例
  9. Spark Streaming揭秘 Day13 数据安全容错(Driver篇)
  10. 【信息安全111班暑期学习工作任务】