Java的加载与执行原理详解 Java程序从编写到最终运行经历了哪些过程_二十四日的博客-程序员秘密

技术标签: java  

前言

Java程序从编写到最终运行大概可概括为3个阶段:编写、编译、运行阶段。

一、编写阶段

  1. 程序员在硬盘某个位置新建一个xxx.java文件
  2. 使用记事本或者其他文本编辑器例如EditPlus打开xxx.java文件
  3. 在xxx.java文件中编写符合Java语法规则的源代码
  4. 保存源代码

二、编译阶段

  1. 使用编译器(javac.exe【JDK安装后自带】)将 xxx.java文件编译为 xxx.class文件。如果 xxx.java文件中编写的源代码是符合语法规则的,编译会通过并生成xxx.class字节码文件;如果xxx.java文件中的源代码不符合语法规则,则编译不会通过,也不会生成xxx.class字节码文件。一个java源文件是可以生成多个class文件的。(编译实际上是检查语法)
  2. java命令格式:javac java源文件的路径(路径有绝对路径和相对路径之分)
  3. xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,那么我们称A是一个类,B是一个类,C是一个类。其中A、B、C是类的名字。

三、运行阶段(JRE起作用)

  1. 使用JDK自带的一个命令/工具:java.exe(负责运行的命令/工具)执行字节码文件
  2. java命令格式:java 类名
  3. 执行java程序的步骤:
    <1>.先使用cd命令切换到Test.class文件所在的路径。
    <2>.执行java 类名
    java这个命令,后面跟的是“类名”,而绝对不能跟“文件路径”,因为java命令后面跟的不是文件,是一个“类名”。所以必须先切换到class文件所在路径,也是为了能让类加载器能够找到该class文件。
  4. 往下的步骤就全部交给JVM了,就不需要程序员进行干涉了。当执行java 类名回车以后,会经历以下步骤:
    <1>. 会先启动JVM(java虚拟机)
    <2>. JVM启动之后,JVM会去启动“类加载器classloader”
    类加载器的作用:加载类的。本质上类加载器负责去硬盘上找“类”对应的“字节码”文件。
    假设是“java HelloWorld”,那么类加载器会去硬盘上搜索:HelloWorld.class文件。
    假设是“java Test”,那么类加载器会去硬盘上搜索:Test.class文件。
    <3>. 类加载器如果在硬盘上找不到对应的字节码文件,会报错:找不到或无法加载主类
    类加载器如果在硬盘上找到了对应的字节码文件,类加载器会将该字节码
    文件装载到JVM当中,JVM启动“解释器”将字节码解释为“101010000…”这种
    二进制码,操作系统执行二进制码和硬件交互。
    默认情况下,类加载器去硬盘上找“字节码”文件的时候,默认情况下类加载器(classloader)会从当前路径下找。因此在运行时要先先使用cd命令切换到Test.class文件所在的路径。也可以设置一个环境变量classpath给类加载器指定一个路径,让类加载器去指定的路径下加载字节码文件。
    JVM会通过类加载器将字节码文件装载进去,然后JVM对字节码进行解释,将字节码解释为机器指令(二进制码)。JVM会将生成的二进制码交给OS操作系统,操作系统会执行二进制码和硬件进行交互。

总结

Java程序从编写到编译再到运行是一次完整的加载与执行过程。程序员写的源代码为xxx.java文件,源代码是无法直接被JVM识别。Java程序员编写的代码必须经过编译,将源代码编译为字节码,JVM能够识别字节码文件并将其解释并执行。

.java文件就是源文件,这个文件中编写源代码
.class文件为编译后的字节码文件。

javac命令负责编译
java命令负责运行

java程序的编译和运行过程可以在不同的操作系统上完成。因为java是跨平台的。

java源代码一旦编译之后,如果将源代码删除,只保留字节码文件也是可以执行的,因为参与运行的是字节码。但是最好不要把源程序删除,以防后期需要进行修改。

字节码文件不是二进制文件,它只是接近于二进制的字节码,需要由JVM解释为二进制然后被执行。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42168713/article/details/112102603

智能推荐

2021年安全员-B证(山东省-2021版)考试及安全员-B证(山东省-2021版)考试试卷_童话小镇(王雅丽)的博客-程序员秘密

题库来源:安全生产模拟考试一点通公众号小程序安全员-B证(山东省-2021版)考试根据新安全员-B证(山东省-2021版)考试大纲要求,安全生产模拟考试一点通将安全员-B证(山东省-2021版)模拟考试试题进行汇编,组成一套安全员-B证(山东省-2021版)全真模拟考试试题,学员可通过安全员-B证(山东省-2021版)考试试卷全真模拟,进行安全员-B证(山东省-2021版)自测。1、【判断题】轮胎式起重机启动前应重点检査各安全保护装置和指示仪表应齐全完好,钢丝绳及连接部位应符合规定,燃油、润滑油

unity场景导入与简单场景搭建_withcoco的博客-程序员秘密

unity场景导入与简单场景构建unity场景导入unity简单的场景构建一、创建一个新的Scene场景二、创建设置地形unity场景导入1.在项目目录下创建Scenes文件夹与Prefab文件夹,分别用来存放Scene场景文件和预制件。2.准备好要导入的场景所需组件,我这里使用的是成品素材,导入的部分包括两个部分:map与Terrain,在导入后会生成一个相应的meta文件,便于unity对素材的管理。map文件主要包括场景物体Terrain文件主要包括地形3.在Scenes文件夹中创建

CC++程序训练6---歌德巴赫猜想的证明_输入一个不小于6的偶数n_Du_Chunfeng的博客-程序员秘密

Problem Description验证“每个不小于6的偶数都是两个素数之和”,输入一个不小于6的偶数n,找出两个素数,使它们的和为n。Input输入一个不小于6的偶数n。Output找出两个素数,使它们的和为n。只需要输出其中第一个素数最小的一组数据即可。Example Input80Example Output80=7+73#include &amp;lt;stdio.h&amp;gt;...

latex c语言程序,latex中添加C++代码_弃医从everything的博客-程序员秘密

HttpClientHttp协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且 ...&amp;lbrack;OpenCV&amp;rsqb; Samples 01&amp;colon; drawing基本的几何图形,标注功能. commondLinePar...

应季时令水果蔬菜_任庆 的博客-程序员秘密

春季柠檬、枇杷、圣女果、菠萝、火龙果、草莓、荔枝、桑葚、山竹、樱桃。夏季菠萝、草莓、黑莓、火龙果、蓝莓、荔枝、榴莲、桑葚、桃、山竹、杏、西瓜、香瓜、樱桃、杨梅、椰子、苹果、哈密瓜、龙眼、李子、芒果、蟠桃、油桃、杨桃、百香果、黄桃、猕猴桃、木瓜、葡萄、青提、沙果、无花果。秋季苹果、百香果、菇娘、红提、黄桃、海棠果、火龙果、哈密瓜、龙眼、蓝莓、李子、蜜柑、猕猴桃、木瓜、芒果、...

office2010:打开和关闭Word文档提示“Microsoft Word已停止工作”的解决办法_office2010关闭后弹出停止工作_sharkill的博客-程序员秘密

最近下了个Word文档,用Word2010打开,点一下“启用编辑”后显示”Microsoft Word已停止工作“,然后就自动重启了。而且编辑过程中经常无缘无故停止工作,有时候关闭文档都显示”Microsoft Word已停止工作“。解决方法:①首先,关闭所有Office相关程序;②点击“开始”菜单,选择“运行”,输入 regedit 进入注册表编辑器;③依次展开,找到 HKEY_

随便推点

MySQL(八)之DML_a878787877的博客-程序员秘密

昨天晚上很晚的时候才写完MySQL的常用函数,今天给大家讲一下MySQL的DML。接下来让我们直接来学习了,今天感冒了。身体很难受下午的时候要去买一波药了,不然程序员也扛不住呀。DML全称Data Manipulation Language,数据操作语言。一、插入数据创建格式格式:INSERT INTO 表名(字段名...)VALUES(值...);首先先创...

matlab2010a连接mysql_MATLAB怎样连接MYSQL数据库_weixin_39517902的博客-程序员秘密

1.找到MYSQL的JDBC的JAR包,见这个网址:http://bbs.tucue.com/showtopic.aspx?forumid=70&amp;forumpage=1&amp;topicid=657&amp;go=next,虽然不太官方,不过好使就行~2.解压缩,并将mysql-connector-java-5.1.7-bin.jar文件拷贝到D:/program files/MATLA...

oracle timestamp相减 计算差多少秒_oracle timestamp相减得秒数_程序员石磊的博客-程序员秘密

CREATE OR REPLACE function timestamp_diff(a timestamp, b timestamp) return number is begin return extract (day from (a-b))*24*60*60 + extract (hour from (a-b))*60*60+ extract...

Day04.循环结构_晶晶家的小可爱的博客-程序员秘密

循环结构文章目录循环结构前言一.for-in循环二.While循环三.练习3.1 输入一个正整数判断是不是素数。3.2 输入两个正整数,计算它们的最大公约数和最小公倍数。3.3 打印如下所示的三角形图案。总结前言我们在写程序的时候,一定会遇到需要重复执行某条或某些指令的场景。例如用程序控制机器人踢足球,如果机器人持球而且还没有进入射门范围,那么我们就要一直发出让机器人向球门方向移动的指令。在这个场景中,让机器人向球门方向移动就是一个需要重复的动作,当然这里还会用到上一课讲的分支结构来判断机器

学习Java开发的人有哪些,Java适合哪类人群学习?_尔玉797的博客-程序员秘密

现在的培训Java怎么样,学习Java开发的人有哪些,Java适合哪类人群学习?提到Java这个名词时,大多数人脑袋中都会浮现出三个字:“程序猿”,从事互联网行业的人群则会浮现出“码农”的字眼。只要是接触过计算机,就不会对这个名词感到陌生,或多或少都有些听闻。不少朋友也对Java挺感兴趣,但都觉得Java需要涉及的知识会非常广,会非常难学,应该只有计算机专业的人才能学得会吧,以自己半路出家的学识能力不一定学得会,于是便放弃了学习Java的打算。那么事实确实如此吗,Java非常难学吗,培训学Java怎么样,J

开通此博客的原因?_申请博客的原因_wlichun1988的博客-程序员秘密

一、记录自己在计算机学习中遇到的问题以及解决办法。 二、保存自己在信息技术领域的学习心得。

推荐文章

热门文章

相关标签