java基础 之 从Class.forName()跟.class的区别看类的初始化

简介: java基础 之 从Class.forName()跟.class的区别看类的初始化

代码如下:

public class Test {
    public static void main(String[] args) throws Exception {
        System.out.println("调用.class");
        Class<Main> mainClass = Main.class;
        System.out.println("调用Class.forName()");
        Class<?> aClass = Class.forName("com.study.spring.transaction.classdemo.Main");
    }
}
public class Main {
    static {
        System.out.println("初始化");
    }
}

运行main方法,结果如下:

调用.class
调用Class.forName()
初始化

从这里我们可以知道,Class.forName会自动初始化这个Class对象,而.class的方式,并不会初始化该Class对象。说到这里,我们要先解释下什么是Class对象。


我们知道,类是程序的一部分,每个类都有一个Class对象。换言之,每当编写并且编译了一个新类就会产生一个Class对象。为了生成这个类的对象,运行这个程序的java虚拟机将使用被称为“类加载器”的子系统。


类加载器子系统实际上可以包涵一条类加载器链,但是只有一个原生类加载器,它是jvm实现的一部分。原生类加载器加载的是所谓的可信类,包括java API类,它们通常从本地盘加载的。在这条链中,通常不需要添加额外的类加载器,但是如果你有特殊需求(例如以某种特殊的方式加载类,以支持web服务器,或者在网络中下载类),那么你有一种方式可以挂接额外的类加载器。


所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创建第一个对类的静态成员的引用时,就会加载这个类。因此,java程序在它开始运行之前并非被完全加载,其各个部分是在必须时才加载的。这一点与许多传统语言都不同。


类加载器首先检查这个类的Class对象是否已经加载。如果尚未加载,默认的类加载器就会根据类名查找.class文件(例如,某个类加载器可能会在数据库中查找字节码)。在这个类的字节码被加载时,它们会接受验证,以确保其没有被破坏,并且不包含不良java代码(这是java种用于安全防范目的的措施之一)。


为了使用类而做的准备工作实际包含三个步骤:


  • 加载,这是由类加载器执行的。该步骤将查找字节码(通常在classpath路径下查找,但这并非是必须的),并且中这些字节码中创建一个class对象
  • 链接,在链接阶段将验证类中的字节码,为静态域分配存储空间,并且如果必需的话,将解析这个类创建的对其他类的所有引用
  • 初始化,如果该类具有超类,则对其初始化,执行静态初始化器和静态初始化块

当我们使用.class的方式时,初始化被延迟到了对静态方法或者是非常数静态域进行首次引用时才执行。


相关文章
|
10天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
25 1
|
9天前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
22 0
java基础(13)String类
|
10天前
|
Java
java基础(4)public class 和class的区别及注意事项
本文讲解了Java中`public class`与`class`的区别和注意事项。一个Java源文件中只能有一个`public class`,并且`public class`的类名必须与文件名相同。此外,可以有多个非`public`类。每个类都可以包含一个`main`方法,作为程序的入口点。文章还强调了编译Java文件生成`.class`文件的过程,以及如何使用`java`命令运行编译后的类。
15 3
java基础(4)public class 和class的区别及注意事项
|
3天前
|
Java API
Java的日期类都是怎么用的
【10月更文挑战第1天】本文介绍了 Java 中处理日期和时间的三个主要类:`java.util.Date`、`java.util.Calendar` 和 `java.time` 包下的新 API。`Date` 类用于表示精确到毫秒的瞬间,可通过时间戳创建或获取当前日期;`Calendar` 抽象类提供丰富的日期操作方法,如获取年月日及时区转换;`java.time` 包中的 `LocalDate`、`LocalTime`、`LocalDateTime` 和 `ZonedDateTime` 等类则提供了更为现代和灵活的日期时间处理方式,支持时区和复杂的时间计算。
26 14
|
5天前
|
Java
java中面向过程和面向对象区别?
java中面向过程和面向对象区别?
14 4
|
10天前
|
存储 Java
Java编程中的对象和类
【8月更文挑战第55天】在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
25 10
ly~
|
8天前
|
安全 Java 大数据
php跟java有什么区别
PHP 和 Java 是两种常用编程语言,各有特色。PHP 语法简洁灵活,适用于快速开发中小型网站,尤其在 Web 脚本和数据库交互中表现出色。Java 则语法严谨,强类型特性使其在企业级应用、移动开发及大数据处理中更受欢迎,具备高稳定性和安全性。通过优化,PHP 性能可提升,而 Java 在大规模应用中表现更佳。总体而言,PHP 开发效率高但维护性稍差,Java 则更注重代码质量和安全性。
ly~
17 5
|
14天前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
|
7天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
9天前
|
Java
java的class类
java的class类
18 5
下一篇
无影云桌面