代码如下:

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的方式时,初始化被延迟到了对静态方法或者是非常数静态域进行首次引用时才执行。

最新文章

  1. ResourceHacker(4.5.30)单文件绿色汉化版
  2. 个人作业-Week3
  3. python学习(解析python官网会议安排)
  4. JavaSE——TCP网络编程(二)
  5. elfutils-libelf由于依赖而安装失败
  6. 制作一个可以给team所有成员用的开发者证书
  7. FactoryBean的使用--转
  8. 【转】谁说Vim不是IDE?(三)
  9. sendmsg: no buffer space available
  10. Python 参数传递
  11. word排版的一些小技巧积累
  12. 一份关于npm的新手指南
  13. Mac Java Idea 下面Git配置简要教程
  14. 查看apk签名 和 keystore 的信息
  15. UVA10256 The Great Divide
  16. rsync实现数据备份
  17. python中使用XPath笔记
  18. [Converge] Batch Normalisation
  19. ubuntu14.04 安装系统/搜狗/QT/qq/wps/CAJviewer
  20. 使用HtmlAgilityPack抓取Ethereum Tokens信息

热门文章

  1. GeoGebra案例(傅里叶级数的方波)
  2. 学习Saleforce | 业内第一份Salesforce学习者数据报告
  3. 包、mode模式、if-else语句、switch语句
  4. linux CVE-2019-13272 本地特权漏洞
  5. CentOS6.5环境下搭建Apache httpd服务器
  6. audio的自动播放报错解决
  7. 推荐web前端框架bootstrap
  8. share sdk
  9. 百度云虚拟空间(BCH)
  10. PHP把PNG图片转化为JPG时透明背景变黑色