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

首先你要明白在java里面任何class都要装载在虚拟机上才能运行。这句话就是装载类用的(和new 不一样,要分清楚)。

至于什么时候用,你可以考虑一下这个问题,给你一个字符串变量,它代表一个类的包名和类名,你怎么实例化它?只有你提到的这个方法了,不过要再加一点。
A a = (A)Class.forName("pacage.A").newInstance();
这和你
A a = new A();
是一样的效果。

关于补充的问题
答案是肯定的,jvm会执行静态代码段,你要记住一个概念,静态代码是和class绑定的,class装载成功就表示执行了你的静态代码了。而且以后不会再走这段静态代码了。

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

动态加载和创建Class 对象,比如想根据用户输入的字符串来创建对象
String str = 用户输入的字符串
Class t = Class.forName(str);
t.newInstance();

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

Java中工厂模式经常使用newInstance()方法来创建对象,因此从为什么要使用工厂模式上可以找到具体答案。 例如:
class c = Class.forName(“Example”);
factory = (ExampleInterface)c.newInstance();

其中ExampleInterface是Example的接口,可以写成如下形式:
String className = "Example";
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

进一步可以写成如下形式:
String className = readfromXMlConfig;//从xml 配置文件中获得字符串
class c = Class.forName(className);
factory = (ExampleInterface)c.newInstance();

上面代码已经不存在Example的类名称,它的优点是,无论Example类怎么变化,上述代码不变,甚至可以更换Example的兄弟类Example2 , Example3 , Example4……,只要他们继承ExampleInterface就可以。

从JVM的角度看,我们使用关键字new创建一个类的时候,这个类可以没有被加载。但是使用 newInstance()方法的时候,就必须保证:1、这个类已经加载;2、这个类已经连接了。而完成上面两个步骤的正是Class的静态方法 forName()所完成的,这个静态方法调用了启动类加载器,即加载 java API的那个加载器。

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

最后用最简单的描述来区分new关键字和newInstance()方法的区别:
newInstance: 弱类型。低效率。只能调用无参构造。
new: 强类型。相对高效。能调用任何public构造。

下面内容转自
http://blog.csdn.net/iceman1952/archive/2007/03/07/1523025.aspx
介绍的是 forName() 和 ClassLoader 的 loadClass 方法。
现在终于知道了为什么 forName()是会执行 static 语句,因为默认情况它总是初始化这个被装载的类。
关于forName()方法
这个方法总是返回要加载的类的Class类的实例
1、forName(String className)单参数时, initialize=true
    a.总是使用当前类装载器(也就是装载执行forName()请求的类  的类装载器)
    b.总是初始化这个被装载的类(当然也包括:装载、连接、初始化)
2、forName(String className, boolean initialize, ClassLoader loader)
    a.loader指定装载参数类所用的类装载器,如果null则用bootstrp装载器。
    b.initialize=true时,肯定连接,而且初始化了;
    c.false时,绝对不会初始化,但是可能被连接了,但是这里有个例外,如果在调用这个forName()前,已经被初始化了,那么返回的类型也肯定是被初始化的(当然,这里也暗含着:被同一个loader所装载的,而且这个类被初始化了)

关于用户自定义的类装载器的loadClass()方法
1、loadClass(String name)单参数时, resolve=false
    a.如果这个类已经被这个类装载器所装载,那么,返回这个已经被装载的类型的Class的实例,否则,就用这个自定义的类装载器来装载这个class,这时不知道是否被连接。绝对不会被初始化
    b.这时唯一可以保证的是,这个类被装载了。但是不知道这个类是不是被连接和初始化了
2、loadClass(String name, boolean resolve)
    a.resolve=true时,则保证已经装载,而且已经连接了。resolve=falses时,则仅仅是去装载这个类,不关心是否连接了,所以此时可能被连接了,也可能没有被连接

转载于:https://my.oschina.net/liangzhenghui/blog/176420

Class.forName有什么作用相关推荐

  1. Java class.forname 功能介绍

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

  2. class.forName()详解

    class.forName()方法的作用: 它的作用就是按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机 ...

  3. Effective Java之静态工厂代替构造器(一)

    优势1:它们有名称,所以在多个构造器时,能够根据静态工厂的方法的名称找到哪个构造器. 优势2:能够实现单例模式,不必在每次调用重新创建新对象. 优势3:当创建参数化参数实例时,使用静态工厂方法更加简单 ...

  4. java高级编程期末考试题_java高级编程考题

    Java高级课程测试 1在进行swing开发时,经常用的布局管理器有那几种?(5) 2Gui组件,容器,框架,到底有怎样的关系,请举例说明?(5) 3在进行swing开发中会用到事件处理,那事件处理的 ...

  5. Think in Java第四版 读书笔记8第14章 类型信息(RTTI与反射)

    Java如何在运行时识别对象和类的信息? 1.RTTI(Run-time type information) 它假定我们在编译时已经知道了所有类型 2.反射 它允许我们在运行时发现和使用类的信息 14 ...

  6. JDBC及操作数据库步骤

    概念 JDBC-数据库连接,是由一些类和接口构成的API,是J2SE的一部分,有java.sql.javax.sql包组成.下面看一下JDBC API与应用程序和数据库驱动及数据库之间的关系: 可以看 ...

  7. java-core-basic

    Java核心技术 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JU4Jbwtm-1655624104104)(C:\Users\WadeHao\AppData\Roa ...

  8. java连接数据库实现图书管理器

    java连接数据库请转另一篇博客 https://blog.csdn.net/pig_boss/article/details/109731567 1.主界面类(Main_InterFace.java ...

  9. Java基础总结--面试答案个人总结

    答案为自己总结 1.面向对象的特征有哪些方面? 封装,继承,多态 封装: 就是类的私有化.将代码及处理数据绑定在一起的一种编程机制,该机制保证程序和数据不受外部干扰. 继承: 就是保留父类的属性,开扩 ...

最新文章

  1. kafka数据丢失的场景
  2. 用Java语言编写ajax设计模式_使用JavaScript发布订阅设计模式实现Ajax请求节流
  3. django 整理一
  4. 基于若依框架的二次开发_SAP Commerce(原Hybris)的订单处理框架和SAP CRM One Order框架...
  5. 一份关于如何为回归任务选择机器学习算法指南
  6. java并发condition_Java并发之Condition的实现分析
  7. 软件项目管理第三课—如何应对投标书的软件功能报价
  8. jenkins乱码解决问题
  9. HTTP协议【详解】——经典面试题
  10. php公众号模板推送开发教程,微信公众号之模板推送
  11. 谷歌浏览器不支持html2.0,谷歌浏览器不能播放视频怎么办_chrome浏览器无法播放视频的解决方法-系统城...
  12. android 全局dns解析,Android中DNS解析
  13. 云片网短信模版自定义变量的替换内容
  14. 【转载】Python Numpy求余弦值和欧几里得距离
  15. 解决click事件在移动端操作延迟300ms问题和点击时穿透问题
  16. “浅尝”JavaScript设计模式
  17. Python Turtle 小项目 6
  18. centos8设置ip
  19. 优酷视频云技术解析-立哥技术
  20. 刷机错误ERROR:STATUS_BROM_CMD__FAIL

热门文章

  1. linux awk 分组统计
  2. fzu - 2164 Jason's problem
  3. BZOJ4723[POI2017]Flappy Bird——模拟
  4. 线上环境HBASE-1.2.0出现oldWALs无法自动回收情况;
  5. CodeForces - 434D Nanami's Power Plant
  6. weblogic配置domain和删除domain
  7. [转]Windows Shell 编程 第十四章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988010】...
  8. 二叉堆(最小堆)(数据结构与算法分析的代码实现)
  9. Android面试题(五) --重要
  10. 一个稍微复杂的VTK程序