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


相关推荐: 如何用wdcp快速搭建高效网站?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  网易LOFTER官网链接 老福特网页版登录地址  如何用景安虚拟主机手机版绑定域名建站?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  中山网站制作网页,中山新生登记系统登记流程?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  如何用PHP快速搭建高效网站?分步指南  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】  如何快速启动建站代理加盟业务?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  西安专业网站制作公司有哪些,陕西省建行官方网站?  linux写shell需要注意的问题(必看)  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  如何在IIS管理器中快速创建并配置网站?  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  如何在宝塔面板中创建新站点?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  微信小程序 wx.uploadFile无法上传解决办法  Java遍历集合的三种方式  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  MySQL查询结果复制到新表的方法(更新、插入)  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何在阿里云香港服务器快速搭建网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  如何挑选最适合建站的高性能VPS主机?  Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何在新浪SAE免费搭建个人博客?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程  Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  如何确保FTP站点访问权限与数据传输安全?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel storage目录权限问题_Laravel文件写入权限设置  Laravel如何使用Blade模板引擎?(完整语法和示例)  教学论文网站制作软件有哪些,写论文用什么软件 ?  如何做网站制作流程,*游戏网站怎么搭建?  如何在万网开始建站?分步指南解析  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践