文章目录

  • 1:IDEA 如何查看字节码文件
    • 1.1:通过File-->Settings... 打开 External Tools 窗口
    • 1.2:点击图中的“+”,填写内容
    • 1.3:选择一个java文件,右键选择 External Tools-->查看字节码(这是自己定义的名),即可查看字节码。
  • 2:查看字节码文件(需要 jvm 基础)
    • 2.1:基本的字节码
    • 2.2:带有异常的字节码
    • 2.3:带有 finally 块
    • 2.4:了解具体的字节码指令含义
  • 3:语法糖

1:IDEA 如何查看字节码文件

对于 IDEA 查看字节码,有人喜欢每次使用的时候在命令行敲命令,我觉得比较麻烦,于是添加工具组来实现:
参考:https://blog.csdn.net/xqt1028/article/details/106366375

1.1:通过File–>Settings… 打开 External Tools 窗口

1.2:点击图中的“+”,填写内容


Program:javap.exe的路径,这里要使用绝对路径(jdk安装包的bin目录下)。
Arguments:-v FileNameWithoutExtensionFileNameWithoutExtensionFileNameWithoutExtension.class
Working directory:OutputPathOutputPathOutputPath/FileDirRelativeToSourcepathFileDirRelativeToSourcepathFileDirRelativeToSourcepath

1.3:选择一个java文件,右键选择 External Tools–>查看字节码(这是自己定义的名),即可查看字节码。

2:查看字节码文件(需要 jvm 基础)

虚拟机栈中是一个个栈帧,对应着调用的一个个 java 方法,但是栈帧中还是有内容的,可以分成以下几部分:

  • Local Variable Table:本地变量(局部变量)表,方法内部使用的,参数也算在内,以变量槽为最小单位,每个槽32位的内存空间。
    局部变量表主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类原始数据类型、对象引用(reference),以及returnAddress类型。 局部变量表所需的容量大小在编译期就可以被完全确定下来,并保存在方法的Code属性中。
  • Operand Stack:操作数栈(表达式栈)
    对于long的处理(store and load),多数虚拟机的实现都是原子的
    局部变量,没必要加volatile,线程私有的。
    操作数栈所需的容量大小在编译期就可以被完全确定下来,并保存在方法的Code属性中。通过标准的出入栈完成数据访问
    32位数据类型所占的栈容量为1,64位数据类型所占的栈容量为2。
  • Dynamic Linking:动态链接,指向常量池的符号链接,如果没有解析,就去动态解析
  • return address:返回值地址
    a() -> b(),方法a调用了方法b, b方法的返回值放在什么地方

2.1:基本的字节码

public class HelloWorld {public static void main(String[] args) {System.out.println("hello world");}
}



注意:字节码的一些指令需要自己去了解学习,这里不再花费大的篇幅去介绍。

2.2:带有异常的字节码

public class Demo3_11_1 {public static void main(String[] args) {int i = 0;try {i = 10;} catch (Exception e) {i = 20;}}
}

我们主要查看 main 方法对应的字节码;

2.3:带有 finally 块

public class Demo3_11_4 {public static void main(String[] args) {int i = 0;try {i = 10;} catch (Exception e) {i = 20;} finally {i = 30;}}
}

2.4:了解具体的字节码指令含义

可以把指令复制到网页上进行查询,https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-6.html#jvms-6.5

3:语法糖

所谓的语法糖,指java编译器把.java源代码编译为.class字节码的过程中,自动生成和转换的一些代码,主要是为了减轻程序员的负担,算是java编译器我们的一个额外福利.

这里不再一一展示,大概列举一下:

1:默认构造器:编译器加上的,调用父类object的无参构造方法,前提是自己没有自定义构造器
2:自动拆装箱:编译器给自动转化
3:泛型集合取值:编译泛型会执行泛型擦除的动作,泛型信息消失,被当做object来处理.所以,在取值时,编译器会进行类型转 泛型擦除在字节码是看到的,但是在本地类型方法表还是可以看到的
4:可变参数: String ... args 编译后是 string[] arges ,如果不传参数,会生成空数组,而不是 null
5:foreach循环:数组foreach会被编译成for循环,集合foreach会被编译成iterator遍历
6:swith字符串:变量不能为null,字符串比较的是hashcode码和equals()方法,先比较hashcode是为了提高效率,减少可能的比较,equals()是为了防止hash碰撞. 同时执行了两遍swith,第一次是根据字符串的hashcode和equals()将字符串转换为相应的byte类型,第二遍才是利用byte类型进行比较.
7:swith枚举类:变量不能为null,会定义一个合成类,对jvm可见,对我们不可见.用来映射枚举的 ordinal 和数组元素的关系,枚举的ordinal 表示枚举对象的序号,从0开始.生成一个整形数组,存储枚举对象的序号.真正去swith的时候,实际上是对数组元素进行匹配.
8:枚举类:编译后也是一个类,将枚举元素放在一个数组中.
9:try-with-resources:简化资源关闭.其中,资源对象需要实现AutoCloseable接口,例如,InputStream,OutputStream,Connection,Statement, ResultSet等接口,使用try-with-resources可以不用写finally语句块,编译器会帮助生成关闭资源代码. 内外层异常信息都不会丢失,异常捕捉方式值得我们学习.
10:方法重写时的桥接方法: 方法重写对返回值分两种情况:1是父子类的返回值完全一致 2是子类返回值是父类返回值的子类. 编译器会新建一个方法,合成方法,对程序员不可见.
11:匿名内部类:生成一个新类,会有构造器,传值要求final修饰局部变量.

JAVA 字节码全解相关推荐

  1. java 字节码详解_Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  2. Java字节码(.class文件)格式详解(一)

    原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...

  3. Java数据类型转换全解

    Java数据类型转换全解 我们知道Java语言是典型的支持面向对象的程序语言,但考虑到有些基本Java数据类型的结构简单,占内存小且存取速度快等优点,Java依然提供了对这些非面向对象的简单Java数 ...

  4. 这一次,彻底弄懂 Java 字节码文件!

    作者 | 东升的思考 责编 | Elle 不啰嗦,直接从最最简单的一段Java源代码开启Java整体字节码分析之旅. Java 源码文件 package com.dskj.jvm.bytecode; ...

  5. 从一个class文件深入理解Java字节码结构

    前言 我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结 ...

  6. JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)

    JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...

  7. 【JVM源码解析】模板解释器解释执行Java字节码指令(上)

    本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...

  8. 实例分析理解Java字节码

    Java语言最广为人知的口号就是"一次编译到处运行",这里的"编译"指的是编译器将Java源代码编译为Java字节码文件(也就是.class文件,本文中不做区分 ...

  9. 如何阅读JAVA 字节码(一)

      在阅读JAVA字节码以前,需要回忆一下JVM的结构:   Java字节码的信息主要在Java栈中间体现,下图来自网络,描述了java栈的基本结构:   值得注意的是方法区,在Java虚拟机中,方法 ...

最新文章

  1. 如何将一个彩色图像转换成黑白图像
  2. ChaosBlade 在工商银行混沌工程体系中的应用实践
  3. Docker Compose安装Registry后配置WebUI与客户端
  4. c语言编程安全队列,C语言编程队列的实现
  5. 【华为云技术分享】人脸识别算法的训练之路(下)
  6. 接收字节流_Java之IO流、属性配置文件
  7. 证明谷歌 Go 魅力的 10 个开源项目
  8. PHP操作MongoDB
  9. CSS3动画的常见属性(CSS3)
  10. JavaScript回顾与学习——运算符
  11. Matlab简单教程:条件分支
  12. excel甘特图模板_项目管理工具之甘特图使用流程
  13. EXCEL VBA编程入门一
  14. 唱好铁血丹心谐音正规_铁血丹心(谐音歌词)
  15. 【高自旋和低自旋配合物】
  16. CentOS下安装cups实现局域网共享HP1020打印机
  17. zcmu1684 求余数
  18. 基于python获取雅虎金融股票数据及相关可视化操作
  19. 运筹学研究者关注的Github和CSDN账号
  20. 计算机思维在化工方面的应用,计算思维在化学上的应用.pdf

热门文章

  1. 用面对对象的方式点击表头排序
  2. [无线] Android 系统开发学习杂记
  3. 炒菜机器人康名牌_机器人帮炒菜,九阳、美的产品各有何本领?
  4. mercury php,XAMPP配置Mercury 邮件服务器教程
  5. VMWare 虚拟机如何扩展磁盘空间并挂载到已存在的根目录
  6. vulnhub-Mercury
  7. 14亿人共同的话题:现在做什么最赚钱?
  8. ie检查html快捷键,IE浏览器快捷键大全
  9. [转]Oracle 错误大全
  10. favicon.ico使用方式