博客
关于我
Java中Class.forName()用法和newInstance()方法详解
阅读量:396 次
发布时间:2019-03-05

本文共 1695 字,大约阅读时间需要 5 分钟。

Class.forName()主要用于在Java程序中动态加载类文件。通过调用Class.forName("类名"),JVM会启动类加载器,查找并加载指定类。这种方式与new关键字的用法有明显区别,同时也与newInstance()方法的用法存在一定的差异。

首先,Class.forName()返回的是一个Class对象,而不是直接创建对象。其次,Class.forName()的主要作用是执行类的静态初始化代码段。这意味着在调用Class.forName()之后,目标类必须已经被加载并完成了连接过程。

下面我们将从三个方面详细解析Class.forName()的用法:

  • new与Class.forName()的区别

    • new关键字与Class.forName().newInstance()的对比

      在Java中,new关键字用于在内存中分配对象,直接调用目标类的无参数构造函数。而Class.forName().newInstance()则需要确保目标类已经被加载并连接。通过查看以下代码可以看出两者的区别:

      A a = (A) Class.forName("包名.A").newInstance();A a = new A();

      这两种方式在功能上是等价的,都是用来创建对象a。

    • newInstance()的特殊性

      newInstance()方法有几个限制:

      • 它只能调用无参数的构造函数。
      • 它不支持参数化的构造函数。
      • 它需要确保目标类已经被加载并连接。如果类尚未加载或未完成连接,调用newInstance()会抛出错误。
  • 为什么会有两种创建对象的方式

    • 设计理念的考量

      Java设计者提供了两种不同的方式来创建对象,主要是为了满足不同的需求。new关键字直接在内存中分配资源,而newInstance()则通过类加载机制来完成对象的创建。这种设计体现了Java对可扩展性和灵活性的追求。

    • JVM的内存管理

      从JVM的角度来看,使用new关键字创建对象时,JVM并不需要确保类已经被加载。只要目标类在内存中,JVM即可直接分配内存并调用构造函数。而Class.forName().newInstance()则需要依赖类加载器来完成类的加载和连接过程。

  • Class.forName()的实际应用场景

    • 动态加载外部类库

      在一些需要动态加载外部类库的场景中,Class.forName()是非常有用的。例如,在模块化开发中,可以通过配置文件指定需要加载的类,然后动态调用Class.forName()来加载这些类。

    • 灵活性和降耦

      Class.forName()的另一个重要用途在于提供了一种降耦的方式。开发者可以通过配置文件或其他方式指定需要加载的类,而不需要直接修改源代码。这种方式在分布式系统或插件化架构中尤为重要。

  • Class.forName()的内部实现

    • 类加载机制

      Class.forName()方法实际上调用了JVM的类加载机制。它会首先检查类是否已经被加载,如果未加载则启动类加载器(通常是启动类加载器)。启动类加载器负责查找类文件并将其加载到内存中。

    • 类连接过程

      在类加载过程中,类连接阶段会被执行。这一阶段包括验证、准备和解析等步骤,确保类文件的语法正确,并将符号引用转换为直接引用。

  • Class.forName()与new关键字的对比总结

    • 区别总结
      • Class.forName()是用来动态加载类,而new是直接创建对象。
      • Class.forName().newInstance()需要依赖类加载器完成类的加载和连接过程,而new关键字不需要。
      • newInstance()只能用于无参数构造函数,而new关键字支持任意参数的构造函数。
      • 在性能方面,new关键字更高效,而newInstance()由于依赖类加载机制,可能存在一定的性能开销。
  • 通过以上分析可以看出,Class.forName()和new关键字的主要区别在于对象创建的方式不同。前者依赖类加载器完成类的加载和连接,后者则直接在内存中分配资源并调用构造函数。这种设计既提供了灵活性,也确保了类的正确加载和使用。

    转载地址:http://mtxzz.baihongyu.com/

    你可能感兴趣的文章
    Pharmaceutical的同学们都看过来,关于补码运算的复习相关内容
    查看>>
    phoenix无法连接hbase shell创建表失败_报错_PleaseHoldException: Master is initializing---记录020_大数据工作笔记0180
    查看>>
    Phoenix简介_安装部署_以及连接使用---大数据之Hbase工作笔记0035
    查看>>
    phoenix连接hbase报错Can not resolve hadoop120, please check your network_记录026---大数据工作笔记0187
    查看>>
    Photoshop工作笔记001---Photoshop常用快捷键总结
    查看>>
    Reids配置文件redis.conf中文详解
    查看>>
    PHP
    查看>>
    Regular Expression Notes
    查看>>
    PHP $FILES error码对应错误信息
    查看>>
    PHP $_FILES函数详解
    查看>>
    PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
    查看>>
    php & 和 & (主要是url 问题)
    查看>>
    php -- 魔术方法 之 判断属性是否存在或为空:__isset()
    查看>>
    php -- 魔术方法 之 获取属性:__get()
    查看>>
    php -树-二叉树的实现
    查看>>
    PHP -算法-二路归并
    查看>>
    php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
    查看>>
    php 360 不记住密码,JavaScript_多种方法实现360浏览器下禁止自动填写用户名密码,目前开发一个项目遇到一个很 - phpStudy...
    查看>>
    regExp的match、exec、test区别
    查看>>
    php 404 自定义,APACHE 自定义404错误页面设置方法
    查看>>