Java的加载与执行原理详解 Java程序从编写到最终运行经历了哪些过程
前言
Java程序从编写到最终运行大概可概括为3个阶段:编写、编译、运行阶段。
一、编写阶段
- 程序员在硬盘某个位置新建一个xxx.java文件
- 使用记事本或者其他文本编辑器例如EditPlus打开xxx.java文件
- 在xxx.java文件中编写符合Java语法规则的源代码
- 保存源代码
二、编译阶段
- 使用编译器(javac.exe【JDK安装后自带】)将 xxx.java文件编译为 xxx.class文件。如果 xxx.java文件中编写的源代码是符合语法规则的,编译会通过并生成xxx.class字节码文件;如果xxx.java文件中的源代码不符合语法规则,则编译不会通过,也不会生成xxx.class字节码文件。一个java源文件是可以生成多个class文件的。(编译实际上是检查语法)
- java命令格式:javac java源文件的路径(路径有绝对路径和相对路径之分)
- xxx.java源文件经过编译之后生成了A.class、B.class、C.class等文件,那么我们称A是一个类,B是一个类,C是一个类。其中A、B、C是类的名字。
三、运行阶段(JRE起作用)
- 使用JDK自带的一个命令/工具:java.exe(负责运行的命令/工具)执行字节码文件
- java命令格式:java 类名
- 执行java程序的步骤:
<1>.先使用cd命令切换到Test.class文件所在的路径。
<2>.执行java 类名
【java这个命令,后面跟的是“类名”,而绝对不能跟“文件路径”,因为java命令后面跟的不是文件,是一个“类名”。所以必须先切换到class文件所在路径,也是为了能让类加载器能够找到该class文件。】 - 往下的步骤就全部交给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解释为二进制然后被执行。
Java的加载与执行原理详解 Java程序从编写到最终运行经历了哪些过程相关推荐
- 【胖虎的逆向之路】01——动态加载和类加载机制详解
胖虎的逆向之路 01--动态加载和类加载机制详解 一.前言 二.类的加载器 1. 双亲委派模式 2. Android 中的类加载机制 1)Android 基本类的预加载 2)Android类加载器层级 ...
- Fragment的懒加载与生命周期详解
提示:本文仅为笔者学习记录 Fragment的懒加载与生命周期详解 什么是懒加载 了解Fragment的生命周期 onAttach onCreate onCreateView onActivityCr ...
- android fragment加载布局的方式,Android中Fragment的加载方式与数据通信详解
Android中Fragment的加载方式与数据通信详解 发布时间:2020-08-22 18:55:57 来源:脚本之家 阅读:155 作者:Joah 一.加载方式 1. 静态加载 1.1 加载步骤 ...
- JAVA消息服务JMS规范及原理详解
一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进 ...
- java斐波那契查找_详解Java Fibonacci Search斐波那契搜索算法代码实现
一, 斐波那契搜索算法简述 斐波那契搜索(Fibonacci search) ,又称斐波那契查找,是区间中单峰函数的搜索技术. 斐波那契搜索采用分而治之的方法,其中我们按照斐波那契数列对元素进行不均等 ...
- java 判断数组已经存满_详解Java中数组判断元素存在几种方式比较
1. 通过将数组转换成List,然后使用List中的contains进行判断其是否存在 public static boolean useList(String[] arr,String contai ...
- java object数组转实体类_详解Java中String JSONObject JSONArray List实体类转换
JSON使用阿里的fastJson为依赖包 gradle依赖管理如下: compile group: "com.alibaba", name: "fastjson&quo ...
- java实现的微服务架构_详解Java 微服务架构
一.传统的整体式架构 传统的整体式架构都是模块化的设计逻辑,如展示(Views).应用程序逻辑(Controller).业务逻辑(Service)和数据访问对象(Dao),程序在编写完成后被打包部署为 ...
- windows下c/c++创建Java虚拟机加载可执行jar包
一般的,我们使用java.exe或者javaw.exe来执行我们的java应用程序.但是实际上这两个可执行程序只是java虚拟机的启动器,使用java.exe将会创建一个控制台窗口用于输出,而java ...
最新文章
- STATIC_URL/STATIC_ROOT/STATICFILES_DIRS/urls.py中的static区别
- 作者:秦兵(1968-),女,哈尔滨工业大学计算机科学与技术学院教授、博士生导师。...
- java zip追加_基于Java向zip压缩包追加文件
- mii-tool查看网卡状态
- python学习day02
- python 按从小到大的顺序组合成一个字典_Python 按照某个或某几个字段来排序字典列表...
- Visio2007产品密钥
- 2022年中式面点师(中级)复训题库及模拟考试
- [zz] 导致你创业失败的18个错误 [2007-05-03]
- ggplot2设置坐标轴范围_6.2 坐标轴:对连续变量设置坐标轴显示范围
- Netty源码解析-Netty内存泄露检测
- 微信绑定会员卡服务器出错,会员卡信息更新失败
- 青云云服务器怎么上传文件,青云QingCloud发布文件存储,进一步完善软件定义存储解决方案...
- 云付注册推荐人怎么填?云付新手怎么操作
- 今天感受了一下ipad
- 跳槽找工作避坑指南(2019最新新版)
- 编解码器的世界 - 从字幕组说起
- 矿区无人值守称重系统权限有哪些,怎么分配
- pyechart 详细地图_pyechart 详细地图_pyechart使用
- 今天是个好日子2014-12-01