JAVA 字节码全解
文章目录
- 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 字节码全解相关推荐
- java 字节码详解_Java基础篇(JVM)——字节码详解
这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...
- Java字节码(.class文件)格式详解(一)
原文链接:http://www.blogjava.net/DLevin/archive/2011/09/05/358033.html 小介:去年在读<深入解析JVM>的时候写的,记得当时还 ...
- Java数据类型转换全解
Java数据类型转换全解 我们知道Java语言是典型的支持面向对象的程序语言,但考虑到有些基本Java数据类型的结构简单,占内存小且存取速度快等优点,Java依然提供了对这些非面向对象的简单Java数 ...
- 这一次,彻底弄懂 Java 字节码文件!
作者 | 东升的思考 责编 | Elle 不啰嗦,直接从最最简单的一段Java源代码开启Java整体字节码分析之旅. Java 源码文件 package com.dskj.jvm.bytecode; ...
- 从一个class文件深入理解Java字节码结构
前言 我们都知道,Java程序最终是转换成class文件执行在虚拟机上的,那么class文件是个怎样的结构,虚拟机又是如何处理去执行class文件里面的内容呢,这篇文章带你深入理解Java字节码中的结 ...
- JVM学习笔记(Ⅰ):Class类文件结构解析(带你读懂Java字节码,这一篇就够了)
JVM学习笔记(Ⅰ):Class类文件结构解析,带你读懂Java字节码 前言:本文属于博主个人的学习笔记,博主也是小白.如果有不对的地方希望各位帮忙指出.本文主要还是我的学习总结,因为网上的一些知识分 ...
- 【JVM源码解析】模板解释器解释执行Java字节码指令(上)
本文由HeapDump性能社区首席讲师鸠摩(马智)授权整理发布 第17章-x86-64寄存器 不同的CPU都能够解释的机器语言的体系称为指令集架构(ISA,Instruction Set Archit ...
- 实例分析理解Java字节码
Java语言最广为人知的口号就是"一次编译到处运行",这里的"编译"指的是编译器将Java源代码编译为Java字节码文件(也就是.class文件,本文中不做区分 ...
- 如何阅读JAVA 字节码(一)
在阅读JAVA字节码以前,需要回忆一下JVM的结构: Java字节码的信息主要在Java栈中间体现,下图来自网络,描述了java栈的基本结构: 值得注意的是方法区,在Java虚拟机中,方法 ...
最新文章
- 如何将一个彩色图像转换成黑白图像
- ChaosBlade 在工商银行混沌工程体系中的应用实践
- Docker Compose安装Registry后配置WebUI与客户端
- c语言编程安全队列,C语言编程队列的实现
- 【华为云技术分享】人脸识别算法的训练之路(下)
- 接收字节流_Java之IO流、属性配置文件
- 证明谷歌 Go 魅力的 10 个开源项目
- PHP操作MongoDB
- CSS3动画的常见属性(CSS3)
- JavaScript回顾与学习——运算符
- Matlab简单教程:条件分支
- excel甘特图模板_项目管理工具之甘特图使用流程
- EXCEL VBA编程入门一
- 唱好铁血丹心谐音正规_铁血丹心(谐音歌词)
- 【高自旋和低自旋配合物】
- CentOS下安装cups实现局域网共享HP1020打印机
- zcmu1684 求余数
- 基于python获取雅虎金融股票数据及相关可视化操作
- 运筹学研究者关注的Github和CSDN账号
- 计算机思维在化工方面的应用,计算思维在化学上的应用.pdf