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中将个别页面强制横屏其他页面竖屏
网站制作软件有哪些,制图软件有哪些?

