当前位置:首页 > 单片机 > 架构师社区
[导读]原文:https://bbs.huaweicloud.com/blogs/250559当你学会了java语言之后,你写了一些代码,然后你想要执行你的代码,来达成某些功能。那么,你都知道这段代码都是如何执行的吗?1.编译成class众所周知,java代码是不能直接在jvm上执行的,...

原文:https://bbs.huaweicloud.com/blogs/250559

当你学会了java语言之后,你写了一些代码,然后你想要执行你的代码,来达成某些功能。那么,你都知道这段代码都是如何执行的吗?

1. 编译成class

众所周知,java代码是不能直接在jvm上执行的,执行的是class文件,将java代码编程class文件,需要编译

常用的编译方法是:javac xxx.java

但目前常见的java编辑工具,如eclipse和ideal都自带自动编译动能

2. jvm的构成

让我们回忆一下jvm的构成:

一段java代码是如何执行的?
主题上分为五个部分:

方法区,本地方法栈,java堆,java栈,程序计数器

其中,java栈,本地方法栈,程序计数器为线程私有,其余为线程共享

那么,方法在哪个地方执行呢?

java栈。

栈的遵循的方式是先进后出,java栈中方法的执行也遵循此规律,方法执行的步骤又称为栈帧。

3. 方法的顺序执行和栈帧

上代码:

Java 代码

public class Main {
    public static void a(){
        b();
    }

    public static void b(){
        c();
    }

    public static void c(){
        System.out.println("Hello world!");
    }

    public static void main(String[] args) {
        a();
    }
}
上面是一段很简单的代码,主体上就是:

(1)一个Main类

(2)上面定义了一个main方法

(3)该main方法调用了静态方法a

(4)方法a调用方法b

(5)方法b调用方法c

(6)方法c打印了“Hello world!”

前文说过,java定义的非本地方法都是在java栈内执行的,一方法一栈帧

所以假设

mian方法对应栈帧m

  • a方法对应栈帧a

  • b方法对应栈帧b

  • c方法对应栈帧c

根据方法的调用,入栈顺序为:m,a,b,c

所以,栈帧出栈(即方法执行)顺序为:c,b,a,m

4. class文件反编译过后的样子

上一节,方法或栈帧在java栈的执行顺序,但在方法体内的内容是怎么执行的呢。

前文提到,jvm执行的是class文件,而class文件内是什么?

class文件内是一组指令集。

如何证明呢,还是再看一段代码。

Java 代码

public class Calculator{
    public int add(){
        int n = 10;
        int m = 20;
        int r = n   m;
        return r;
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        int a = calculator.add();
        System.out.println(a);
    }
}
如上代码,实现的功能是:

(1)定义两个变量,相加

(2)main方法new对象,调用方法

但,class文件是不可以直接查看的。

我们可以采用反编译的方法,反编译命令:

javap -c xxx.class

一段java代码是如何执行的?
上述文件反编译后的样子如下:

一段java代码是如何执行的?
每个方法下面的Code,都是一组指令集。

5. 指令集详解

在讨论指令集之前,首先要讲一个概念,那就是对栈帧进一步拆分。

栈帧一共分为四个部分:局部变量表、操作数栈、动态链接、方法返回地址

其中,局部变量表和操作数栈是最重要的两个部分,局部变量表存放在方法中定义的局部变量,操作数栈相当于jvm的一个缓存,所有的操作都必须在此处进行,所有的变量都必须加载到操作数栈才能被使用。所以,所谓指令,就是在局部变量表和操作数栈来回倒腾的过程。

下面对指令进行分类讲解:

(1)入栈指令

整型入栈指令:

  • 取值-1~5采用iconst指令;

  • 取值-128~127采用bipush指令;

  • 取值-32768~32767采用sipush指令;

  • 取值-2147483648~2147483647采用ldc指令。

非整型入栈指令:

  • float,String类型也使用ldc指令

  • double和long类型使用ldc_2w

  • boolean类型视作0和1

  • null的入栈指令为:aconst_null

(2)存储指令

将操作数栈中的常量保存在局部变量表中的某个位置

如:

  • istore_1:将上面入栈的整型常量保存在局部变量表中的第1个位置

  • fstore_2:将上面入栈的浮点常量保存在局部变量表中的第2个位置

  • dstore_10:将上面入栈的双浮点常量保存在局部变量表中的第10个位置

  • lstore_20:将上面入栈的长整常量保存在局部变量表中的第20个位置

  • astore_100:将上面入栈的引用常量保存在局部变量表中的第100个位置

(3)变量入栈指令

  • iload_1:局部变量表中的第1个位置的整型变量入栈

  • fload_2:局部变量表中的第1个位置的浮点型变量入栈

  • dload_10:局部变量表中的第1个位置的双浮点型变量入栈

  • lload_20:局部变量表中的第1个位置的长整型变量入栈

  • aload_100:局部变量表中的第100个位置的引用型变量入栈

(4)计算指令

  • 加:iadd、ladd、fadd、dadd
    减:isub、lsub、fsub、dsub
    乘:imul、lmul、fmul、dmul
    除:idiv、ldiv、fdiv、ddiv

注意:栈顶计算,一次只能计算一个表达式

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

纽约2026年8月18日 /美通社/ -- 美国万通证券作为美国金融业监管局及SIPC成员,总部位于纽约、提供全牌照服务的投资银行和证券经纪及交易商,今日宣布为其客户YXT.COM GROUP HOLDING Ltd(纳...

关键字: COM GROUP HOLDING 代码

北京2026年8月13日 /美通社/ -- 在 AI 重塑软件工程范式的当下,企业数智化转型正步入深水区。近日,全球领先的AI工厂全栈服务商软通动力宣布,全面引入阿里云全栈 Agentic 智能编程平台 Qoder,成功...

关键字: 阿里云 全栈 AI 代码

纽约2026年8月8日 /美通社/ -- 美国万通证券作为美国金融业监管局及SIPC成员,总部位于纽约、提供全牌照服务的投资银行和证券经纪及交易商,今日宣布为其客户YXT.COM GROUP HOLDING Ltd(纳斯...

关键字: COM GROUP HOLDING 代码

北京2026年8月6日 /美通社/ -- 伴随AI Coding等长流程场景的渗透,单一Agent已难以满足企业复杂的业务需求,由大量Agent持续并发运行、共同完成复杂业务的"多智能体群智协同&qu...

关键字: AI 智能体 测试 代码

科罗拉多州布鲁姆菲尔德2026年7月29日 /美通社/ -- Quantinuum Inc.(纳斯达克股票代码:QNT)(简称“Quantinuum”)今日宣布,将于2026...

关键字: ANTI 量子计算 CCD 代码

美国北卡罗来纳州夏洛特2026年7月24日 /美通社/ -- 霍尼韦尔科技(纳斯达克代码:HON)近日公布了2026年第二季度业绩。合并财报包含霍尼韦尔航空航天(纳斯达克代码:HONA)的经营数据。霍尼韦尔航空航天已于2...

关键字: 霍尼韦尔 航天 代码 自动化

在软件工程数十年的迭代历程中,无数开发者都曾遭遇过“上帝类”带来的噩梦:一个数千行的类里同时混杂了数据查询、格式转换、日志打印、异常处理等十多种完全不相关的逻辑,每次修改其中一个小功能,都要通读整个类的所有代码,稍有不慎...

关键字: 程序 代码

AI编程助手已经彻底改变了一名开发者一个上午能完成的工作量。过去需要几个小时才能理清思路、写出草稿的代码,现在几秒钟就能生成。对于探索性工作和快速原型开发来说,这种效率提升是实实在在的。

关键字: AI编程助手 代码 嵌入式

结合英矽智能的Pharma.AI平台与保瑞在全球范围内的研发、生产、质量控制及商业化能力,探索创新的药物研发模式 上海和台北2026年7月15日 /美通社/ -- 由生成式人工智能(AI)驱动的临床阶段生物科技公司英矽...

关键字: 人工智能 智能驱动 ARMA 代码

美国旧金山和中国苏州2026年6月30日 /美通社/ -- 信达生物制药集团(香港联交所股票代码:01801),一家致力于研发、生产和销售肿瘤、自身免疫、代谢及心血管、眼科等重大疾病领域创新药物的生物制药公司,今日和礼来...

关键字: CD BSP 代码 OV
关闭