Java虚拟机装载和初始化一个class类代码解析

发布时间 - 2026-01-11 03:12:17    点击率:

在 java 应用程序开发中,只有被 java 虚拟机装载的 Class 类型才能在程序中使用。只要生成的字节码符合 java 虚拟机的指令集和文件格式,就可以在 JVM 上运行,这为 java 的跨平台性提供条件。下面,我们来看看虚拟机是如何装载和初始化一个 class 类的。

装载一个类

学习过C/C++语言的读者知道,C/C++源代码必须首先别编译成本地的机器代码,然后还需要一个链接代码过程。该链接过程的主要任务就是:合并不同的源码文件产出的中间代码,并最终获得一个可直接执行的应用程序。然后,Java语言不是这么做的,Java应用中类似于链接过程的步骤是在字节码被装载到JVM中之后再执行的。

正如我们所知,JVM存在不止一个类加载器,不同的加载器使用不同的方式来加载类。但是,它们都只在必须加载类时,才开始装载类。当然,如果已装载完毕的类引用了某些未装载的类,类装载器会进一步去装载这些类,整个的装载过程是递归的。

装载时机与方式

在Java中,类的装载策略是由类加载器控制的。我们使用下面这个简单的示例代码来演示类的装载方式与时机:

// TestLoader.java
package compiler;
public class TestLoader {
public static void main(String[] args) {
System.out.println("test");
}
}
// A.java
package compiler;
public class A {
public void method(){
System.out.println("inside of A");
}
}

再看一下它们的目录结构:

|-src
|--compiler
|------A.java
|------TestLoader.java

为了获得每个类加载的信息,我们可以使用如下的命令来运行程序。其中的 “-verbose:class” 参数告诉 JVM 打印出每次加载类的信息。

java -verbose:class -classpath /home/ron/workspace/UltimateTest/bin/ compiler.TestLoader

整个程序的输出信息很繁琐,我们摘取其中重要的部分展示如下:

[Loaded sun.misc.JavaSecurityProtectionDomainAccess from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$2 from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$Key from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.Principal from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded compiler.TestLoader from file:/home/xiwang/workspace/UltimateTest/bin/]
test
[Loaded java.lang.Shutdown from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]

现在,假设我们把 TestLoader.java 修改成如下所示:

package compiler;
public class TestLoader {
public static void main(String[] args) {
System.out.println("test");
A a = new A();
a.method();
}
}

再次执行同样的运行命令,我们获得输出结果变成如下所示:

[Loaded sun.misc.JavaSecurityProtectionDomainAccess from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$2 from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.ProtectionDomain$Key from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.security.Principal from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded compiler.TestLoader from file:/home/xiwang/workspace/UltimateTest/bin/]
test
[Loaded compiler.A from file:/home/xiwang/workspace/UltimateTest/bin/]
inside of A
[Loaded java.lang.Shutdown from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]
[Loaded java.lang.Shutdown$Lock from /usr/local/java/jdk1.6.0_34/jre/lib/rt.jar]

读者可仔细查看两者的区别,可以发现只有当 类A 被使用时,该类对应的 A.class 才会被装载。总结起来,一个类的加载条件是

(1) 当使用 new 操作符执行某类时。比如 SomeClass some = new SomeClass()。

(2)当已加载类中有一个静态引用指向某类时。 比如 System.out 。

初始化时机与方式

在Java中,一个类被加载完毕后,不会立即执行类的初始化工作。当类中的符号被第一次使用时,该类才开始被初始化。在初始化顺序方面:JVM会首先完成父类的初始化,再执行子类的初始化;对于类中静态的常量,会按照定义的先后顺序完成初始化;最后会保证在初始化之前,每个属性都会有一个默认值。至于类中各种类型成员的初始化顺序细节,建议查看本站的这篇文章。

总结

以上就是本文关于虚拟机如何装载和初始化一个Java class类的全部内容,希望对您有所帮助。

感谢大家对本站的支持!


# java  # 虚拟机  # 装载  # 初始化  # Java泛型和Class类用法示例  # 浅谈Java中的class类  # Java中Class类的作用与深入理解  # Java中通过Class类获取Class对象的方法详解  # 学习Java中Class类及其用法  # Java语言class类用法及泛化(详解)  # java中Class类的基础知识点及实例  # 加载  # 类中  # 所示  # 递归  # 有一个  # 是在  # 某类  # 子类  # 是由  # 才会  # 能在  # 来看看  # 还需要  # 可以使用  # 只在  # 这么做  # 再看  # 这篇文章  # 可直接  # 后会 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  python中快速进行多个字符替换的方法小结  网易LOFTER官网链接 老福特网页版登录地址  如何在腾讯云免费申请建站?  网站建设要注意的标准 促进网站用户好感度!  原生JS实现图片轮播切换效果  Android 常见的图片加载框架详细介绍  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  浅述节点的创建及常见功能的实现  教学论文网站制作软件有哪些,写论文用什么软件 ?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  如何为不同团队 ID 动态生成多个独立按钮  利用JavaScript实现拖拽改变元素大小  Python文件流缓冲机制_IO性能解析【教程】  Python结构化数据采集_字段抽取解析【教程】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  青岛网站建设如何选择本地服务器?  简单实现jsp分页  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  Laravel distinct去重查询_Laravel Eloquent去重方法  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  Laravel如何优化应用性能?(缓存和优化命令)  香港服务器选型指南:免备案配置与高效建站方案解析  如何解决hover在ie6中的兼容性问题  Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel如何自定义分页视图?(Pagination示例)  教你用AI将一段旋律扩展成一首完整的曲子  怎样使用JSON进行数据交换_它有什么限制  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  什么是javascript作用域_全局和局部作用域有什么区别?  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Android中AutoCompleteTextView自动提示  深圳网站制作平台,深圳市做网站好的公司有哪些?  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  C#如何调用原生C++ COM对象详解  Laravel如何实现用户密码重置功能?(完整流程代码)  北京专业网站制作设计师招聘,北京白云观官方网站?  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  Laravel如何与Inertia.js和Vue/React构建现代单页应用  Laravel如何处理表单验证?(Requests代码示例)  微信h5制作网站有哪些,免费微信H5页面制作工具?  iOS中将个别页面强制横屏其他页面竖屏  网站制作软件有哪些,制图软件有哪些?