引入

之前已经讲述了如何在 windows 环境通过 命令行的方式编译Java 代码。

此篇文章作为JVM 系列的引入,简要的说明如何在 windows 平台进行 Java 编译后的 class 文件的查看。其实 JDK 中已经内置了这些工具。可以在 %JAVA_HOME%\bin 目录下看到 javap.exe 这个可执行文件。一些其他的工具在该目录下也都能看到,不过不是此处重点,还是言归正传。本文只做基本演示,后面详细介绍字节码时会逐行详细分析。

示例代码

此处就举一个最简单不过的 Java 示例程序,代码如下:

public class Test{private int m;public int inc(){return m + 1;}}

利器 javap

进入命令行,编译完源码后,会看到源码文件旁有个同名的 .class 文件。接着执行如下命令

javap -c Test  (或 javap -c Test.class)

可以看到如下结果:

F:\tmp\jvmTmp>javap -c TestCompiled from "Test.java"
public class Test {public Test();Code:0: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: returnpublic int inc();Code:0: aload_01: getfield      #2                  // Field m:I4: iconst_15: iadd6: ireturn
}

这只是展示了当前类和方法的信息。如果要查看详细内容包括常量池、行号表、异常表等信息,可以通过如下命令查看:

javap -verbose Test

执行命令结果如下:

F:\tmp\jvmTmp>javap -verbose TestClassfile /F:/tmp/jvmTmp/Test.classLast modified 2018-7-18; size 265 bytesMD5 checksum 0d5efc4b65ae7eb6d64f84136ce58ff9Compiled from "Test.java"
public class Testminor version: 0major version: 52flags: ACC_PUBLIC, ACC_SUPER
Constant pool:#1 = Methodref          #4.#15         // java/lang/Object."<init>":()V#2 = Fieldref           #3.#16         // Test.m:I#3 = Class              #17            // Test#4 = Class              #18            // java/lang/Object#5 = Utf8               m#6 = Utf8               I#7 = Utf8               <init>#8 = Utf8               ()V#9 = Utf8               Code#10 = Utf8               LineNumberTable#11 = Utf8               inc#12 = Utf8               ()I#13 = Utf8               SourceFile#14 = Utf8               Test.java#15 = NameAndType        #7:#8          // "<init>":()V#16 = NameAndType        #5:#6          // m:I#17 = Utf8               Test#18 = Utf8               java/lang/Object
{public Test();descriptor: ()Vflags: ACC_PUBLICCode:stack=1, locals=1, args_size=10: aload_01: invokespecial #1             // Method java/lang/Object."<init>":()V4: returnLineNumberTable:line 1: 0public int inc();descriptor: ()Iflags: ACC_PUBLICCode:stack=2, locals=1, args_size=10: aload_01: getfield      #2             // Field m:I4: iconst_15: iadd6: ireturnLineNumberTable:line 6: 0
}
SourceFile: "Test.java"

可以看到多了文件路径、文件校验、上次修改时间、大小、版本信息、常量池等信息。这是展示字节码信息最丰富的命令了。class 文件中的信息几乎都展示出来了。其中第 11 行可以看到 Constant pool 就是常量池的意思,即行号 12 到 29 都是常量池部分。常量池中的常量通常以 #开头接上序号。

#3 = Class              #17            // Test

如上所示就是第三个常量,= 号后面是该常量项的类型,后面 #17,表示指向第 17 个常量,这里不做展开。

更多用法

当然,javap 的用法不知这些,可以通过如下命令查看所有用法:

F:\tmp\jvmTmp>javap -help用法: javap <options> <classes>
其中, 可能的选项包括:-help  --help  -?        输出此用法消息-version                 版本信息-v  -verbose             输出附加信息-l                       输出行号和本地变量表-public                  仅显示公共类和成员-protected               显示受保护的/公共类和成员-package                 显示程序包/受保护的/公共类和成员 (默认)-p  -private             显示所有类和成员-c                       对代码进行反汇编-s                       输出内部类型签名-sysinfo                 显示正在处理的类的系统信息 (路径, 大小, 日期, MD5 散列)-constants               显示最终常量-classpath <path>        指定查找用户类文件的位置-cp <path>               指定查找用户类文件的位置-bootclasspath <path>    覆盖引导类文件的位置

大家可以都尝试下,加深印象。

Java虚拟机之字节码查看工具相关推荐

  1. java+字节码工具64位_jclasslib 下载-jclasslib 32位64位(java字节码查看工具) 5.1 官方版 - 河东下载站...

    jclasslib是款免费的开源java字节码的查看工具:它支持进行查看您需要进行使用汉字运用到的Java字节码,并且还拥有一个的类库来让开发者进行读取,包括了修改.对JavaClass文件.字节码的 ...

  2. [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符

    说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...

  3. JVM笔记:Java虚拟机的字节码指令详解

    1.字节码 Java能发展到现在,其"一次编译,多处运行"的功能功不可没,这里最主要的功劳就是JVM和字节码了,在不同平台和操作系统上根据JVM规范的定制JVM可以运行相同字节码( ...

  4. Java虚拟机(JVM) - 字节码

    一.什么是字节码? 1.字节码概述 Java 字节码是 Java 虚拟机的指令集.它的作用类似于汇编器,汇编器是 C++ 代码的别名表示.一旦编译了 java 程序,就会生成 java 字节码.用更恰 ...

  5. Java 指令与字节码

    Java 指令与字节码 查看class文件 编写简单java代码 编译代码 查看class文件 Java字节码总的结构表 常量池 常量池容量计数器 字面量和符号引用 全限定名 简单名称 描述符 常量类 ...

  6. Java反编译字节码文件

    如何查看 Java 的字节码文件? 在 Java 中,字节码文件.class实际上是二进制文件,并不能直接查看.要想查看,我们只能通过反编译对其进行解析,然后查看解析后的源码. 如何反编译字节码文件 ...

  7. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  8. java探针 字节码增强_深入浅出Java探针技术1--基于java agent的字节码增强案例

    Java agent又叫做Java 探针,本文将从以下四个问题出发来深入浅出了解下Java agent 一.什么是java agent? Java agent是在JDK1.5引入的,是一种可以动态修改 ...

  9. jbe 可以用来修改Java class的字节码,配合jd-gui 使用

    jbe  可以用来修改Java class的字节码,配合jd-gui 使用 转载于:https://www.cnblogs.com/rirtue/p/9626490.html

最新文章

  1. Winform中使用ZedGraph实现曲线图中字体去掉边框
  2. 【转载】c语言中的可变参数编程
  3. Wireshark抓包—maybe caused by 'IP chechsum offload'?
  4. pythonfind_python实现find -name的功能
  5. Geany编辑器配置Python路径(Windows10)
  6. Android 应用框架
  7. LeetCode 1952. 三除数
  8. Github | 标星3W+ ! Face Recognition世界上最简洁的人脸识别库!
  9. “中文编程”会是解决中国程序员编程效率的秘密武器,成为中国软件工程的“银弹”么?...
  10. 蓝桥杯-天干地支问题
  11. 如何为 Apple 设备使用通用控制?
  12. c语言编写一个用户登录界面,怎么用C语言编写个登陆界面?
  13. 小程序开发视频教程免费下载
  14. 【MOOC】建筑智能化系统工程(南工职)(1)基础知识
  15. 栈中的peek()、pop()和push()、Add()方法
  16. xcode 配置wechat_Xcode 真机调试微信支付 提示 mainfest.json配置APPID和订单的appid 不一致...
  17. 高项考试-信息系统服务管理
  18. 一个一站式流式处理云平台解决方案
  19. 2008全球城市竞争力最新排名出炉
  20. 硬盘检测软件测试培训,认识专业的考机工具PassMark BurnInTest_软件测试_软件测试培训_软件测试频道_中国IT实验室...

热门文章

  1. CSS给元素添加边框(样式、颜色、宽度)
  2. 基于GEE与哨兵1号影像数据提取水体
  3. 基于kalman滤波的磨损预测算法matlab仿真
  4. 带你走进 ERNIE
  5. 从键盘输入一个小写字母,转化为大写字母并输出。
  6. 周鸿袆:360回归A股不是为炒股 是出于国家安全考虑
  7. 第七届蓝桥杯有奖竞猜 JAVA
  8. [codeforces 1333A] Little Artem 读懂题+找规律+多举例
  9. MySQL 中 You can‘t specify target table ‘表名‘ for update in FROM clause解决办法
  10. Facebook投手的多账号管理软件-VMLogin中文版防关联浏览器-安全高效管理每个Facebook帐号