IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> JAVA 字节码全解 -> 正文阅读

[开发工具]JAVA 字节码全解

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 F i l e N a m e W i t h o u t E x t e n s i o n FileNameWithoutExtension FileNameWithoutExtension.class
Working directory: O u t p u t P a t h OutputPath OutputPath/ F i l e D i r R e l a t i v e T o S o u r c e p a t h FileDirRelativeToSourcepath FileDirRelativeToSourcepath

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修饰局部变量.   
  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:56:36  更:2022-05-09 12:56:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/14 15:06:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码