javap 是一个能将 class 文件,反编成我们可读格式的工具。
查看字节码 假设有一个编译后的字节码文件 Foo.class
1 2 3 4 5 6 7 8 9 10 javap Foo // 打印所有非私有的字段和方法 javap -p Foo // 打印所有字段和方法 (包括 private) javap -v Foo // 打印详细信息,分四个部分。 // 1. 基本信息:class 文件版本号(JRE版本),类的访问权限,该类以及父类的名字,所实现接口,字段,方法以及属性的数目。这类信息通常被用于 Java 虚拟机的验证和运行 // 2. 常量池:存放各种常量以及符号引用。常量池的每一项都有一个索引,并且可能引用其他的常量池项。 // 3. 字段区域:用来列举类中的各个字段 (字段描述符 descriptor 以及访问权限 flags) // 4. 方法区域:用来列举勒种的各个方法 (方法描述符 descriptor,访问权限 flages 以及 代码区域 Code) // 如果仅想查看方法对应的字节码,可以用 -c 代替 -v javap -c Foo // 打印方法对应的字节码信息
编译器对字符串的优化 1 2 3 4 5 public static void main (String[] args) { String str = "aa" + "bb" + "cc" + "dd" ; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 public static void main (String[] args) { String str = "aa" + "bb" + "cc" + "dd" ; System.out.println("My String:..." + str); } 0 : ldc #2 2 : astore_1 3 : getstatic #3 6 : new #4 9 : dup 10 : invokespecial #5 13 : ldc #6 15 : invokevirtual #7 18 : aload_119 : invokevirtual #7 22 : invokevirtual #8 25 : invokevirtual #9 0 : ldc #2 2 : astore_1 3 : getstatic #3 6 : aload_1 7 : invokedynamic #4 , 0 12 : invokevirtual #5 15 : return
Title: javap 小记
Author: mjd507
Date: 2018-10-02
Last Update: 2024-01-27
Blog Link: https://mjd507.github.io/2018/10/02/Javap-Intro/
Copyright Declaration: This station is mainly used to sort out incomprehensible knowledge. I have not fully mastered most of the content. Please refer carefully.