Java Class.forName()用法和newInstance()方法原理解析

 更新时间:2020年08月01日 10:04:40   作者:小尾学长  
这篇文章主要介绍了Java Class.forName()用法和newInstance()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Class.forName()主要功能

Class.forName(xxx.xx.xx)返回的是一个类,

Class.forName(xxx.xx.xx)的作用是要求JVM查找并加载指定的类,也就是说JVM会执行该类的静态代码段。

下面,通过解答以下三个问题的来详细讲解下Class.forName()的用法。

①new 和Class.forName()有什么区别和newInstance的用法?

A a = (A)Class.forName(“pacage.A”).newInstance();
A a = new A();

这两种实例化的方式是一样的效果。

上述的例子中都是创建了一个对象A的实例化对象a。下面这个例子我们来看看newInstance的作用

String str = “ABCDEFG” ; //创建一个字符串

Class t = Class.forName(str); //获取到str这个变量的类 相当于String t

t.newInstance(); // 相当于 t = new String

在初始化一个类,生成一个实例的时候,newInstance()方法和new关键字除了一个是方法,一个是关键字外,最主要有什么区别?它们的区别在于创建对象的方式不一样,前者(newInstance)是使用类加载机制,后者(new)是创建一个新类。那么为什么会有两种创建对象方式?这主要考虑到软件的可伸缩、可扩展和可重用等软件设计思想。

从JVM的角度上看

我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用newInstance()方法的时候,就必须保证:

1、这个类已经加载;

2、这个类已经连接了。

而完成上面两个步骤的正是Class的静态方法forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。

现在可以看出,newInstance()实际上是把new这个方式分解为两步,即首先调用Class加载方法加载某个类,然后实例化。 这样分步的好处是显而易见的。我们可以在调用class的静态加载方法forName时获得更好的灵活性,提供给了一种降耦的手段。

区别

首先,newInstance( )是一个方法,而new是一个关键字;

其次,Class下的newInstance()的使用有局限,因为它生成对象只能调用无参的构造函数,而使用 new关键字生成对象没有这个限制。

简言之:

newInstance(): 弱类型,低效率,只能调用无参构造。

new: 强类型,相对高效,能调用任何public构造。

Class.forName(“类名”)返回的是类。

Class.forName(“类名”).newInstance() 返回的是object 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java深入讲解Bean作用域与生命周期

    Java深入讲解Bean作用域与生命周期

    这篇文章主要介绍了浅谈Spring中Bean的作用域和生命周期,从创建到消亡的完整过程,例如人从出生到死亡的整个过程就是一个生命周期。本文将通过示例为大家详细讲讲,感兴趣的可以学习一下
    2022-06-06
  • Java中try catch 的基本用法示例

    Java中try catch 的基本用法示例

    这篇文章主要给大家介绍了关于Java中try catch 的基本用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java监听器的作用及用法代码示例

    Java监听器的作用及用法代码示例

    这篇文章主要介绍了Java监听器的作用及用法代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • SpringBoot中REST API 接口传参的实现

    SpringBoot中REST API 接口传参的实现

    我们在开发 REST API 的过程中,经常需要传递参数,本文主要介绍了SpringBoot中REST API 接口传参的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • SpringBoot中@RequestBody不能和Multipart同时传递的问题解决

    SpringBoot中@RequestBody不能和Multipart同时传递的问题解决

    本文主要介绍了SpringBoot中@RequestBody不能和Multipart同时传递的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • java日期操作工具类(获取指定日期、日期转换、相隔天数)

    java日期操作工具类(获取指定日期、日期转换、相隔天数)

    这篇文章主要为大家详细介绍了java日期操作工具类,包括获取指定日期、日期转换、相隔天数等操作,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Java中的反射机制详解

    Java中的反射机制详解

    这篇文章主要介绍了JAVA 反射机制的相关知识,文中讲解的非常细致,代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
    2021-09-09
  • Java算法练习题,每天进步一点点(1)

    Java算法练习题,每天进步一点点(1)

    方法下面小编就为大家带来一篇Java算法的一道练习题(分享)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望可以帮到你
    2021-07-07
  • java 中线程等待与通知的实现

    java 中线程等待与通知的实现

    这篇文章主要介绍了java 中线程等待与通知的实现的相关资料,希望通过本文能帮助到大家,让大家掌握这样的功能,需要的朋友可以参考下
    2017-09-09
  • java父子节点parentid树形结构数据的规整

    java父子节点parentid树形结构数据的规整

    这篇文章主要介绍了java父子节点parentid树形结构数据的规整,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论