无需已编译类,如何从javac或JRE获取Java类版本?
如何提前获知JDK将生成的类文件版本?
查看已编译类文件的版本
可以用javap命令从已编译的类二进制文件中获取类版本信息,命令如下:
javap -verbose Test | grep 'minor\|major'
执行后会得到类似输出:
minor version: 0 major version: 55
其中major version对应着特定的JDK版本(比如55对应JDK 11)。
提前获知JDK编译生成的类版本
正如你所说,java -version只能看到JDK的版本信息,无法直接得知它会生成的类文件版本,不过有几种简单方法可以提前获取这个信息:
- 利用JDK版本与类版本的对应关系:JDK主版本和类文件的
major version有固定对应规则(比如JDK 8对应52、JDK 11对应55、JDK 17对应61),知道当前JDK的主版本就能直接对应到类版本。 - 查看javac的默认target版本:执行
javac -target(不带参数),命令会报错并显示默认的target版本,这个版本就是编译生成的类文件对应的JDK版本,进而可以对应到major version。示例:
javac -target
输出(JDK 11环境下):
javac: invalid target release: Usage: javac <options> <source files> ... -target <release> Generate class files for specific VM version. Supported targets: 1.6, 1.7, 1.8, 9, 10, 11 Default target: 11
这里默认target为11,对应类版本的major值55。
- 查看系统属性
java.class.version:通过以下命令直接获取当前JDK默认生成的类文件版本:
java -XshowSettings:properties -version | grep java.class.version
输出(JDK 11环境下):
java.class.version = 55.0
这个值就是类文件的major.minor版本(55.0对应minor版本0,major版本55)。
相关错误说明
这类问题通常和java.lang.UnsupportedClassVersionError有关——当用高版本JDK编译的类文件在低版本JVM上运行时,就会触发这个错误,提前掌握编译生成的类版本可以有效避免这类问题。
内容的提问来源于stack exchange,提问作者LMC
相关产品推荐
相关产品推荐

