码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Java 虚拟机操作码探秘:常量指令


    在 Java 虚拟机指令(操作码)集 中给出了一个操作码的列表。针对所有的指令,仅仅给出了一个大概介绍,对理解来说可以说毫无助力。为了弥补这个短板,这里也学习 “Hessian 协议解释与实战”系列 那样,来一个详细解释和实战,配合实例来做个深入分析和讲解。这是这个系列的第一篇文章,就以列表中第一部分“常量”指令开始。

    从 Java 虚拟机指令(操作码)集 列表上来看,一共 21 个指令;按照处理数据的类型,合并同类项后,剩下有 nop 、、、、、、、、和等几个指令。下面,按照顺序,对其进行一一讲解。

    操作码助记符的首字母一般是有特殊含义的,表示操作码所作用的数据类型: i 代表对 int 类型的数据操作; l 代表 long ; s 代表 short ; b 代表 byte ; c 代表 char ; f 代表 float , d 代表 double ; a 代表 reference。

    nop

    根据 Chapter 6. The Java Virtual Machine Instruction Set:nop 来看,就是“Do nothing”,暂时没有找到使用方法。就不做多介绍,后续看到相关资料,再做补充。

    const

    *const 是一个大类,根据不同的操作数类型,又分为、、、和等几个分类。

    const 指令主要就是将相关类型的“常量”(与 Java 使用 static final 修饰的“常量”的定义不同,这里是 Java 代码中存在的“直接量”,比如给对象赋值的 `null`等)推送至栈顶。下面对其一一介绍。

    aconst_null

    这里只有 aconst_null ,直接上代码演示:

    /
     * 字节码示例代码
     *
     * @author D瓜哥 · https://www.diguage.com
     */
    public class Example {
        /
         * 操作码 aconst_null 示例
         */
        public Object testAconst() {
            return null;
        }
    }

    使用 javac Example.java 编译,然后使用 javap 来查看编译的结果:

    $ javap -c Example
    Compiled from "Example.java"
    public class Example {
      public Example();
        Code:
           0: aload_0
           1: invokespecial #1                  // Method java/lang/Object."":()V
           4: return
    
      public java.lang.Object testAconst();
        Code:
           0: aconst_null
           1: areturn
    }

    在上述结果中,我们如愿看到了 aconst_null 操作码。从上面的 testAconst 方法的指令来看,是将 null 加载到栈顶,然后返回。与我们的代码是一致的。

    对比了 Java 8 与 Java 17 的编译结果。从 javap -c 的输出上来看,两者没有差异。以后不再赘述。如有问题,再支出。

    iconst_

    iconst 的完整写法是 iconst_ , 包含 iconst_m1 、 iconst_0 、 iconst_1 、 iconst_2 、 iconst_3 、 iconst_4 和 iconst_5 五个操作码。

    /
     * 字节码示例代码
     *
     * @author D瓜哥 · https://www.diguage.com
     */
    publ
  • 相关阅读:
    交换机与路由器技术:OSPF路由重分发、OSPF的NSSA区域和OSPF虚链路
    数据结构-哈希表-哈希函数-哈希冲突
    Web2 vs. Web3,社交工具的发展会有什么变化?
    Verilog中 generate语句的用法
    目标检测算法——图像分类开源数据集汇总(附下载链接)
    66、Spring Data JPA 的基本功能--CRUD 和 分页
    【Hello Go】Go语言函数
    第十五届蓝桥杯省赛C/C++大学B组真题及赛后总结
    6.27 JAVA笔试题
    The Missing Semester
  • 原文地址:https://blog.csdn.net/m0_73257876/article/details/126685694
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号