教妹学Java(五):Java程序在编译和运行时发生了什么

简介: 教妹学Java(五):Java程序在编译和运行时发生了什么

大家好,我是沉默王二。本篇文章通过我和三妹的对话来谈一谈“Java程序在编译和运行时发生了什么”。


没见过这么有趣的标题吧?“语不惊人死不休”,没错,本篇文章的标题就是这么酷炫,接受不了的同学就别点进来看了,所谓好奇心害死猫;能够接受的同学我只能说你赚到了,你不仅能在阅读的过程中感受到思维的乐趣,还真的能学习到知识。下面就由我来介绍一下故事的背景吧。



我有一个漂亮如花的妹妹(见上图),她叫什么呢?我想聪明的读者朋友们都能猜得出:沉默王三,没错,年方三六。父母正考虑让她向我学习,做一名正儿八经的 Java 程序员。我期初是想反抗的,因为程序员这行业容易掉头发。但家命难为啊,与其反抗,不如做点更积极的事情,写点有趣的文章,教妹妹如何更快地掌握 Java 这门编程语言。毕竟程序员还算得上高薪(都是拿命换的啊)。


(铺垫结束,正文开始)


“二哥,看了上一篇 Hello World 的程序后,我很好奇,它是怎么在屏幕上打印出‘Hello World’呢?”


“三妹啊,‘Hello World’这段代码之所以能够正常工作,可以分为两大步骤:编译和运行,下面二哥会详细来说道说道。”


01、编译时发生了什么


现在,我们有一个名叫 Cmower.java 的文件,它的内容是这样的:


package main.java.com.cmower.java_demo.javatpoint.five;
public class Cmower {
    public static void main(String[] args) {
        System.out.println("大家好,我们沉默王二的妹妹沉默王三");
    }
}



然后我们点击 IDEA 工具栏中的锤子按钮(Build Project)。此时可以在 src 的同级目录 target 的包路径下找到一个 Cmower.class 的文件(如果找不到的话,在目录上右键选择「Reload from Disk」)。

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMTc5Mzg5LWE4NDRiYWZiZTE4MGRhZDIucG5n.png



可以双击打开它。


//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.cmower.java_demo.javatpoint.five;
public class Cmower {
    public Cmower() {
    }
    public static void main(String[] args) {
        System.out.println("大家好,我们沉默王二的妹妹沉默王三");
    }
}



IntelliJ IDEA 默认会用 Fernflower 反编译工具将字节码文件反编译为我们可以看得懂的 Java 源代码。


实际上,字节码文件 Cmower.class 的内容是下面这样的:


// class version 52.0 (52)
// access flags 0x21
public class com/cmower/java_demo/javatpoint/five/Cmower {
  // compiled from: Cmower.java
  // access flags 0x1
  public <init>()V
   L0
    LINENUMBER 3 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
    RETURN
   L1
    LOCALVARIABLE this Lcom/cmower/java_demo/javatpoint/five/Cmower; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1
  // access flags 0x9
  public static main([Ljava/lang/String;)V
   L0
    LINENUMBER 5 L0
    GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
    LDC "\u5927\u5bb6\u597d\uff0c\u6211\u4eec\u6c89\u9ed8\u738b\u4e8c\u7684\u59b9\u59b9\u6c89\u9ed8\u738b\u4e09"
    INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
   L1
    LINENUMBER 6 L1
    RETURN
   L2
    LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}


可以通过「View」中的「Show Bytecode」查看。

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMTc5Mzg5LWY4OGYxMjc3OWM3YTg4YTIucG5n.png



“三妹啊,懂了没?也就是说,在编译阶段,Java 编译器会将 Java 源代码文件编译为字节码文件。二哥再给你画幅图。”


aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMTc5Mzg5LTY5Y2YzOWI1ZWY5NTM2MjEucG5n.png


02、运行时发生了什么


要想运行 Java 文件,可以点击 IDEA 工具栏中的运行按钮。此时会在底部视图中输出文字“大家好,我们沉默王二的妹妹沉默王三”。

aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMTc5Mzg5LWI1YTc3Y2I3N2ZmY2YwNzEucG5n.png



那运行时都发生了什么呢?来画幅图吧!


aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8xMTc5Mzg5LWM3M2YyNjY4NzYwZmVkNzEucG5n.png


字节码加载器:JVM 的一个子系统,用来载入字节码文件。


字节码验证:检查字节码中是否存在可能违法对象访问权限的非法代码。


指令执行:读取字节码流,执行指令。


“懂了没?三妹,字节码在运行前仍然做了不少工作,以防被篡改,保证安全性。”


“二哥,我懂了,你讲得可真棒!”


相关文章
|
9天前
|
Java
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
本文介绍了如何使用IDEA(IntelliJ IDEA)创建一个新的Java项目,并运行一个简单的Java程序输出"Hello Word"。文章详细展示了创建项目的步骤,包括选择JDK版本、设置项目名称和路径、创建包和类,以及编写和运行代码。最后,还展示了如何通过IDEA的运行功能来执行程序并查看输出结果。
30 4
使用IDEA创建项目运行我的第一个JAVA文件输出Helloword
|
6天前
|
XML 存储 JSON
Java程序部署
Java程序部署
|
9天前
|
Java Linux
java基础(3)安装好JDK后使用javac.exe编译java文件、java.exe运行编译好的类
本文介绍了如何在安装JDK后使用`javac.exe`编译Java文件,以及使用`java.exe`运行编译好的类文件。涵盖了JDK的安装、环境变量配置、编写Java程序、使用命令行编译和运行程序的步骤,并提供了解决中文乱码的方法。
24 1
|
7天前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
18 5
|
8天前
|
Java 编译器 数据库连接
探索Java中的异常处理:提升程序的鲁棒性
【9月更文挑战第25天】在Java的世界里,异常是那些不请自来、令人头疼的“客人”。它们悄无声息地潜入我们的代码,一旦出现,便可能导致程序崩溃或行为异常。但是,如果能够妥善管理这些异常,我们就能将潜在的灾难转变为增强程序鲁棒性和用户体验的机会。本文将通过深入浅出的方式,带领读者理解Java异常处理的重要性,并提供实用的策略来优雅地处理这些意外情况。让我们一起学习如何在Java中捕捉、处理和预防异常,确保我们的程序即使在面对不可预见的错误时也能保持稳健运行。
|
14天前
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
|
14天前
|
监控 Java 数据库
Java程序如何进行不停机更新?
Java程序如何进行不停机更新?
16 1
|
IDE Oracle Java
中南林业科技大学Java实验报告一:第一个可以运行的JAVA程序
中南林业科技大学Java实验报告一:第一个可以运行的JAVA程序
158 0
|
Java
Java - 传带命令参数运行程序
Java - 传带命令参数运行程序
601 0
Java - 传带命令参数运行程序
下一篇
无影云桌面