ggboy

javap查看Class编译版本

2018-05-09

1.为什么要需要查看Class版本?

有一次在升级一个老项目的时候,更新某个class文件时运行报错,经过排查发现跟项目原先编译的版本不一致线上jdk是1.7而我自己的jdk是1.8编译环境,这里记录一下是如何排查发现编译版本不一致的问题。

2.排查步骤

  • 用jdk自带命令 javap
javap -v 文件路径/xx.class

uages.class
  Last modified 2018-5-6; size 969 bytes
  MD5 checksum 2c6fca6e3d23143f42b1e61c1c02e017
  Compiled from "xx.java"
public class xx.xx.xx.xx.xx
  minor version: 0
  major version: 50
  flags: ACC_PUBLIC, ACC_SUPER
          .......

上面的minor version: 0和major version: 50就是编译xx.class时使用的jdk编译版本号。
但是它并不是我们所熟悉的jdk版本号(比如jdk1.5)。
不过我们可以把从 JDK 1.1 到 JDK 1.7 编译器编译出的 class 的默认 minor.major version 汇总下就知道对应关系了。

  • jdk编译版本
JDK编译器版本 target 参数 十六进制 minor.major 十进制 minor.major
jdk1.1.8 不能带 target 参数 00 03 00 2D 45.3
jdk1.2.2 不带(默认为 -target 1.1) 00 03 00 2D 45.3
jdk1.2.2 -target 1.2 00 00 00 2E 46.0
jdk1.3.1_19 不带(默认为 -target 1.1) 00 03 00 2D 45.3
jdk1.3.1_19 -target 1.3 00 00 00 2F 47.0
j2sdk1.4.2_10 不带(默认为 -target 1.2) 00 00 00 2E 46.0
j2sdk1.4.2_10 -target 1.4 00 00 00 30 48.0
jdk1.5.0_11 不带(默认为 -target 1.5) 00 00 00 31 49.0
jdk1.5.0_11 -target 1.4 -source 1.4 00 00 00 30 48.0
jdk1.6.0_01 不带(默认为 -target 1.6) 00 00 00 32 50.0
jdk1.6.0_01 -target 1.5 00 00 00 31 49.0
jdk1.6.0_01 -target 1.4 -source 1.4 00 00 00 30 48.0
jdk1.7.0 不带(默认为 -target 1.6) 00 00 00 32 50.0
jdk1.7.0 -target 1.7 00 00 00 33 51.0
jdk1.7.0 -target 1.4 -source 1.4 00 00 00 30 48.0
Apache Harmony 5.0M3 不带(默认为 -target 1.2) 00 00 00 2E 46.0
Apache Harmony 5.0M3 -target 1.4 00 00 00 30 48.0
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章