java forname 原理_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 forname 原理_Java Class.forName()用法和newInstance()方法原理解析相关推荐
- java runnable 参数_Java向Runnable线程传递参数方法实例解析
java Runnable接口:是一个接口,它里面只有一个run()方法,没有start()方法,继2113承Runnable并实现这个方法就可以实现多线程了,但是5261这个run()方法不能自41 ...
- Java基础语法:重写equals方法和hasCode方法
目录 一.为什么需要重写equals和hasCode方法 二.equals和hasCode解读 1.equals方法 2.hasCode方法 三.重写 四.参考资料 一.为什么需要重写equals和h ...
- java private 接口_java接口中 定义 private 私有方法
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- java 生成随机数_Java 生成随机数的 N 种方法
原标题:Java 生成随机数的 N 种方法 www.baeldung.com/java-generating-random-numbers 1.引言 本文将探讨用 Java 生成随机数的不同方法. 2 ...
- java 字符串函数_Java字符串函数– 25+必须知道方法
java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...
- java 数组删除_Java数组删除指定元素的方法(按数组角标删除)
Java最有效的删除数组指定元素的方法,应该属于这一种形式,下面是Java数组按角标删除数据的工具类,代码如下:public static byte[] removeTheElement(byte[] ...
- java泛型方法作用_java泛型的作用与使用方法是什么?
泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变 ...
- java signature 性能_Java常见bean mapper的性能及原理分析
背景 在分层的代码架构中,层与层之间的对象避免不了要做很多转换.赋值等操作,这些操作重复且繁琐,于是乎催生出很多工具来优雅,高效地完成这个操作,有BeanUtils.BeanCopier.Dozer. ...
- java线程池的工作原理_Java 线程池的介绍以及工作原理
在什么情况下使用线程池? 1.单个任务处理的时间比较短 2.将需处理的任务的数量大 使用线程池的好处: 1. 降低资源消耗: 通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2. 提高响应速度 ...
最新文章
- linux学习笔记4:linux的任务调度,进程管理,mysql的安装和使用,ssh工具的使用,linux网络编程...
- ASP.NET Core开发常见“坑”
- H3C 802.1X 客户端的安装使用方法
- Lucene.net站内搜索—5、搜索引擎第一版实现
- 让S3c2410里拥有HIVE注册表的 全部步骤
- python编程入门课_程序设计入门—Python
- 测试 System.SysUtils.TStringHelper
- 帆软报表(finereport)常用函数
- 《流畅的Python第二版》读书笔记——序列数组
- java 中的通讯之HTTP协议
- Druid(数据库连接池)和JdbcTemplate(封装JDBC)使用
- ubuntu安装libjasper.so.1,libpng12.so.0
- 暴雪:星际2仍在审批 筹划中国电竞联赛
- 微信unionID和openID区别
- mac备份文件到windows
- 爬虫Selenium+Chrome 控制浏览器,打开百度网页,输入搜索关键词,点击回车,截取搜索页面
- java开发环境变量的配置
- Linux:网络五元组tcp、udp特性
- 服务器安装配置elasticsearch,kibana,IK分词器和拼音分词器,集群搭建教程
- 大一python期末考试难吗_python期末考试复习