Java虚拟机和真实的计算机一样,运行的都是二进制的机器码;而我们将.java 源代码编译成.class 文件,class文件便是Java虚拟机能够认识的二进制机器码,Java能够识别class文件中的信息和机器指令,进而执行这些机器指令。
实际上class文件中的Java虚拟机代码只会出现数字形式的操作码,不会出现助记符。
java虚拟机原理
《Java虚拟机原理图解》 1.1、class文件基本组织结构
《Java虚拟机原理图解》 1.2、class文件中的常量池
《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(上)
《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)
《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合
《Java虚拟机原理图解》1.4 class文件中的字段表集合–field字段在class文件中是怎样组织的
《Java虚拟机原理图解》1.5、 class文件中的方法表集合–method方法在class文件中是怎样组织的
《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程
javap命令
javap命令常用来对java类文件来进行反编译(将机器指令转为汇编语言),主要用来对java进行分析的工具,在学习Thinking in Java时,由于需要对类文件反编译,以查看jvm到底对我们写的代码做了哪些优化和处理,比如我看的使用+=对字符串进行拼接时,jvm的处理方式。
javap的基本用法
语法:
javap [ 命令选项 ] class. . .
javap 命令用于解析类文件。其输出取决于所用的选项。若没有使用选项,javap 将输出传递给它的类的 public 域及方法。javap 将其输出到标准输出设备上。
命令选项
-help 输出 javap 的帮助信息。
-l 输出行及局部变量表。
-b 确保与 JDK 1.1 javap 的向后兼容性。
-public 只显示 public 类及成员。
-protected 只显示 protected 和 public 类及成员。
-package 只显示包、protected 和 public 类及成员。这是缺省设置。
-private 显示所有类和成员。
-J[flag] 直接将 flag 传给运行时系统。
-s 输出内部类型签名。
-c 输出类中各方法的未解析的代码,即构成 Java 字节码的指令。
-verbose 输出堆栈大小、各方法的 locals 及 args 数,以及class文件的编译版本
-classpath[路径] 指定 javap 用来查找类的路径。如果设置了该选项,则它将覆盖缺省值或 CLASSPATH 环境变量。目录用冒号分隔。
-bootclasspath[路径] 指定加载自举类所用的路径。缺省情况下,自举类是实现核心 Java 平台的类,位于 jrelib下面。
-extdirs[dirs] 覆盖搜索安装方式扩展的位置。扩展的缺省位置是 jrelibext。
使用案例
1 | public class TestMain |
先编译TestMain为.class,然后命令 javap -c TestMain
1 | Compiled from "TestMain.java" |