博客
关于我
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/

    你可能感兴趣的文章
    OpenCV 中的图像转换
    查看>>
    OpenCV 人脸识别 C++实例代码
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>
    opencv 模板匹配, 已解决模板过大程序不工作的bug
    查看>>
    OpenCV 错误:(-215)size.width>0 &&函数imshow中的size.height>0
    查看>>
    opencv&Python——多种边缘检测
    查看>>
    opencv&python——高通滤波器和低通滤波器
    查看>>
    OpenCV+Python识别车牌和字符分割的实现
    查看>>
    OpenCV-Python接口、cv和cv2的性能比较
    查看>>
    OpenCV/Python/dlib眨眼检测
    查看>>
    opencv1-加载、修改、保存图像
    查看>>
    opencv10-形态学操作
    查看>>
    opencv11-提取水平直线和垂直直线
    查看>>
    opencv12-图像金字塔
    查看>>
    opencv13-基本阈值操作
    查看>>
    opencv14-自定义线性滤波
    查看>>
    opencv15-边缘处理
    查看>>
    opencv16-Sobel算子
    查看>>
    opencv17-laplance算子
    查看>>