使用 javap 命令查看 class 文件编译时的 jdk 版本

javap 用法如下:

C:\Users\Nihaorz\Desktop>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>    覆盖引导类文件的位置

 

以 spring-boot-2.7.3.jar 和 spring-boot-3.0.0-M4.jar 分别查看 org.springframework.boot.Banner 接口类为例

spring-boot-2.7.3.jar:

C:\Users\Nihaorz\Desktop>javap -v -cp spring-boot-2.7.3.jar org.springframework.boot.Banner
Classfile jar:file:/C:/Users/Nihaorz/Desktop/spring-boot-2.7.3.jar!/org/springframework/boot/Banner.class
  Last modified 2022-8-18; size 561 bytes
  MD5 checksum 7751438a4b82f31f42e978bf29df6c68
  Compiled from "Banner.java"
public interface org.springframework.boot.Banner
  minor version: 0
  major version: 52
  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
   #1 = Class              #18            // org/springframework/boot/Banner
   #2 = Class              #19            // java/lang/Object
   #3 = Class              #20            // org/springframework/boot/Banner$Mode
   #4 = Utf8               Mode
   #5 = Utf8               InnerClasses
   #6 = Utf8               printBanner
   #7 = Utf8               (Lorg/springframework/core/env/Environment;Ljava/lang/Class;Ljava/io/PrintStream;)V
   #8 = Utf8               MethodParameters
   #9 = Utf8               environment
  #10 = Utf8               sourceClass
  #11 = Utf8               out
  #12 = Utf8               Signature
  #13 = Utf8               (Lorg/springframework/core/env/Environment;Ljava/lang/Class<*>;Ljava/io/PrintStream;)V
  #14 = Utf8               SourceFile
  #15 = Utf8               Banner.java
  #16 = Utf8               RuntimeVisibleAnnotations
  #17 = Utf8               Ljava/lang/FunctionalInterface;
  #18 = Utf8               org/springframework/boot/Banner
  #19 = Utf8               java/lang/Object
  #20 = Utf8               org/springframework/boot/Banner$Mode
{
  public abstract void printBanner(org.springframework.core.env.Environment, java.lang.Class<?>, java.io.PrintStream);
    descriptor: (Lorg/springframework/core/env/Environment;Ljava/lang/Class;Ljava/io/PrintStream;)V
    flags: ACC_PUBLIC, ACC_ABSTRACT
    MethodParameters:
      Name                           Flags
      environment
      sourceClass
      out
    Signature: #13                          // (Lorg/springframework/core/env/Environment;Ljava/lang/Class<*>;Ljava/io/PrintStream;)V
}
SourceFile: "Banner.java"
RuntimeVisibleAnnotations:
  0: #17()
InnerClasses:
     public static final #4= #3 of #1; //Mode=class org/springframework/boot/Banner$Mode of class org/springframework/boot/Banner

其中 major version: 52 表示编译 class 文件使用的是 jdk8

 

spring-boot-3.0.0-M4.jar:

C:\Users\Nihaorz\Desktop>javap -v -cp spring-boot-3.0.0-M4.jar org.springframework.boot.Banner
Classfile jar:file:/C:/Users/Nihaorz/Desktop/spring-boot-3.0.0-M4.jar!/org/springframework/boot/Banner.class
  Last modified 2022-7-21; size 585 bytes
  MD5 checksum 15498843d61cd07a5bf5bc601b16ac54
  Compiled from "Banner.java"
public interface org.springframework.boot.Banner
  minor version: 0
  major version: 61
  flags: ACC_PUBLIC, ACC_INTERFACE, ACC_ABSTRACT
Constant pool:
   #1 = Class              #2             // org/springframework/boot/Banner
   #2 = Utf8               org/springframework/boot/Banner
   #3 = Class              #4             // java/lang/Object
   #4 = Utf8               java/lang/Object
   #5 = Utf8               printBanner
   #6 = Utf8               (Lorg/springframework/core/env/Environment;Ljava/lang/Class;Ljava/io/PrintStream;)V
   #7 = Utf8               MethodParameters
   #8 = Utf8               environment
   #9 = Utf8               sourceClass
  #10 = Utf8               out
  #11 = Utf8               Signature
  #12 = Utf8               (Lorg/springframework/core/env/Environment;Ljava/lang/Class<*>;Ljava/io/PrintStream;)V
  #13 = Utf8               SourceFile
  #14 = Utf8               Banner.java
  #15 = Utf8               RuntimeVisibleAnnotations
  #16 = Utf8               Ljava/lang/FunctionalInterface;
  #17 = Utf8               NestMembers
  #18 = Class              #19            // org/springframework/boot/Banner$Mode
  #19 = Utf8               org/springframework/boot/Banner$Mode
  #20 = Utf8               InnerClasses
  #21 = Utf8               Mode
{
  public abstract void printBanner(org.springframework.core.env.Environment, java.lang.Class<?>, java.io.PrintStream);
    descriptor: (Lorg/springframework/core/env/Environment;Ljava/lang/Class;Ljava/io/PrintStream;)V
    flags: ACC_PUBLIC, ACC_ABSTRACT
    MethodParameters:
      Name                           Flags
      environment
      sourceClass
      out
    Signature: #12                          // (Lorg/springframework/core/env/Environment;Ljava/lang/Class<*>;Ljava/io/PrintStream;)V
}
SourceFile: "Banner.java"
RuntimeVisibleAnnotations:
  0: #16()
Error: unknown attribute
  NestMembers: length = 0x4
   00 01 00 12
InnerClasses:
     public static final #21= #18 of #1; //Mode=class org/springframework/boot/Banner$Mode of class org/springframework/boot/Banner

其中 major version: 61 表示编译 class 文件使用的是 jdk17

 

通过 grep、awk 命令组合得到版本号:

C:\Users\Nihaorz\Desktop>javap -v -cp spring-boot-3.0.0-M4.jar org.springframework.boot.Banner | grep "major version" | awk "{print $3}"
61

 

posted @ 2022-09-09 15:16  Nihaorz  阅读(345)  评论(0)    收藏  举报