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

    你可能感兴趣的文章
    Nginx的可视化神器nginx-gui的下载配置和使用
    查看>>
    Nginx的是什么?干什么用的?
    查看>>
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡和反相代理的配置
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    nginx转发端口时与导致websocket不生效
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置Https证书
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    nginx配置一、二级域名、多域名对应(api接口、前端网站、后台管理网站)
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    nginx配置全解
    查看>>
    Nginx配置参数中文说明
    查看>>
    nginx配置域名和ip同时访问、开放多端口
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置如何一键生成
    查看>>