现在不妨从 JDK 1.1 到 JDK 1.7 编译器编译出的 class 的默认 minor.major version 吧。(又走到 Sun 的网站上翻腾出我从来都没用过的古董来)
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 |
上面比较是 Windows 平台下的 JDK 编译器的情况,我们可以此作些总结:
1) -target 1.1 时 有次版本号,target 为 1.2 及以后都只用主版本号了,次版本号为 0
2) 从 1.1 到 1.4 语言差异比较小,所以 1.2 到 1.4 默认的 target 都不是自身相对应版本
3) 1.5 语法变动很大,所以直接默认 target 就是 1.5。也因为如此用 1.5 的 JDK 要生成目标为 1.4 的代码,光有 -target 1.4 不够,必须同时带上 -source 1.4,指定源码的兼容性,1.6/1.7 JDk 生成目标为 1.4 的代码也如此。
4) 1.6 编译器显得较为激进,默认参数就为 -target 1.6。因为 1.6 和 1.5 的语法无差异,所以用 -target 1.5 时无需跟着 -source 1.5。
5) 注意 1.7 编译的默认 target 为 1.6
6) 其他第三方的 JDK 生成的 Class 文件格式版本号同对应 Sun 版本 JDK
7) 最后一点最重要的,某个版本的 JVM 能接受 class 文件的最大主版本号不能超过对应 JDK 带相应 target 参数编译出来的 class 文件的版本号。
上面那句话有点长,一口气读过去不是很好理解,举个例子:1.4 的 JVM 能接受最大的 class 文件的主版本号不能超过用 1.4 JDK 带参数 -target 1.4 时编译出的 class 文件的主版本号,也就是 48。
因为 1.5 JDK 编译时默认 target 为 1.5,出来的字节码 major.minor version 是 49.0,所以 1.4 的 JVM 是无法接受的,只有抛出错误。
那么又为什么从 1.1 到 1.2、从 1.2 到 1.3 或者从 1.3 到 1.4 的 JDK 升级不会发生 Unsupported major.minor version 的错误呢,那是因为 1.2/1.3/1.4 都保持了很好的二进制兼容性,看看 1.2/1.3/1.4 的默认 target 分别为 1.1/1.1/1.2 就知道了,也就是默认情况下1.4 JDK 编译出的 class 文件在 JVM 1.2 下都能加载执行,何况于 JVM 1.3 呢?(当然要去除使用了新版本扩充的 API 的因素)
六:找到问题解决的方法
那么现在如果碰到这种问题该知道如何解决了吧,还会像我所见到有些兄弟那样,去找个 1.4 的 JDK 下载安装,然后用其重新编译所有的代码吗?其实大可不必如此费神,我们一定还记得 javac 还有个 -target 参数,对啦,可以继续使用 1.5 JDK,编译时带上参数 -target 1.4 -source 1.4 就 OK 啦,不过你一定要对哪些 API 是 1.5 JDK 加入进来的了如指掌,不能你的 class 文件拿到 JVM 1.4 下就会 method not found。目标 JVM 是 1.3 的话,编译选项就用 -target 1.3 -source 1.3 了。
相应的如果使用 ant ,它的 javac 任务也可对应的选择 target 和 source
<javac target="1.4" source="1.4" ............................/>
相关推荐
Java Development Kit (JDK) 8 是 Java 编程语言的一个重要版本,其版本号 `jdk1.8.0_151` 表示这是一个更新版本,属于8u151更新。JDK是Java程序员开发Java应用程序的基础工具集,它包含编译器、调试器、文档生成...
JDK 8u202是Java 8的更新版本,"u202"代表该版本的具体更新号,意味着它是第八个主要版本的第202次更新。对于Windows系统,JDK通常以.exe可执行文件形式提供,方便用户进行图形化安装。 接着,第二个子文件“jdk-8...
标题提到的是一个针对 JDK 1.8 版本的 Java 反编译工具,这表明该工具兼容 Java 8 的字节码,能够在不拥有源代码的情况下查看和理解类文件的实现细节。描述中提到了作者在寻找可用的工具过程中遇到困难,最终找到并...
Java Development Kit(JDK)是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具。JDK1.8版本是Oracle公司发布的一个重要里程碑,它在2014年推出,引入了许多创新特性,极大地...
只需在项目根目录下创建一个`.jdk-version`或`.sdkman-candidates`文件,写入所需JDK版本号即可。 总之,"JDK版本切换工具"是提高开发效率的重要工具,它使得在多版本JDK环境中的工作变得简单且高效。通过学习和...
这个主题主要是关于JDK 11的免费下载及其版本号为11.0.4的详细说明。 **JDK 11的主要特性:** 1. **模块化系统(Project Jigsaw)**:这是JDK 11的一个关键变化,引入了Jigsaw项目,将JRE分解为一系列模块,提高了...
至于压缩包内的文件“yanagishima-20.0”,这可能是Yanagishima的一个特定版本,版本号为20.0。通常,每个版本都会有其独特的改进和修复,例如性能优化、新功能添加或已知问题的修复。在这个版本中,我们可以推测它...
Java Development Kit(JDK)是Java编程语言的核心组件,它包含Java运行时环境(JRE)、编译器、工具集和其他必要的库,使得开发者能够编写、编译和调试Java应用程序。Oracle JDK是官方的Java开发工具包,由甲骨文...
在Java开发过程中,时常会遇到跨版本的问题,尤其是在旧版JDK环境中运行新版JDK编译的代码。这里我们讨论的焦点是“JDK1.5环境下编译的jar包在JDK1.4环境下运行”所遇到的问题,具体表现为“Unsupported major.minor...
下载的文件可能名为“jdk-8u版本号_windows-x64_bin.exe”,其中“版本号”会根据发布的时间而变化。确保你下载的是对应操作系统和处理器架构的正确版本,否则可能会出现兼容性问题。 安装JDK的过程相对简单。运行...
5. **JDK 1.7的版本号**:`jdk1.7.0_80`中的`80`代表该版本的更新号,表示这是JDK 7的第80次更新,通常会修复已知问题,增强性能和稳定性。 6. **下载与更新**:虽然Java JDK 1.7是旧版本,但有时出于兼容性考虑仍...
Java JDK包含了许多组件,其中最重要的是Java编译器(javac)、Java解释器(java)、Java虚拟机(JVM)以及Java类库,这些使得开发者能够编写、编译、调试和运行Java应用程序。 1. **Java编译器** (javac): 它将源...
JDK 1.8是Oracle公司发布的Java 8版本,其具体版本号为1.8.0_25。这个版本在Java的发展历程中扮演了重要的角色,引入了许多新的特性和改进,对于提升开发效率和优化应用程序性能有着显著的影响。 1. **Lambda...
Java 编译器(javac):用于将 Java 源代码编译成 Java 字节码,也就是 .class 文件。 Java 虚拟机(JVM):负责解释执行 Java 字节码,并将其转换为特定硬件平台的机器码。 Java 运行时环境(JRE):包含 Java ...
下载的文件可能名为“jdk-8u版本号_windows-x64_bin.exe”,其中“版本号”会根据发布的时间而变化。确保你下载的是对应操作系统和处理器架构的正确版本,否则可能会出现兼容性问题。 安装JDK20的过程相对简单。...
下载的文件可能名为“jdk-8u版本号_windows-x64_bin.exe”,其中“版本号”会根据发布的时间而变化。确保你下载的是对应操作系统和处理器架构的正确版本,否则可能会出现兼容性问题。 安装JDK的过程相对简单。运行...
下载的文件可能名为“jdk-8u版本号_windows-x64_bin.exe”,其中“版本号”会根据发布的时间而变化。确保你下载的是对应操作系统和处理器架构的正确版本,否则可能会出现兼容性问题。 安装JDK的过程相对简单。运行...
这些信息包括JDK和JRE的安装路径、版本号、默认Java虚拟机(JVM)等。 2. 注册表文件(.reg):.reg文件是Windows操作系统中用来导入或导出注册表键值的文件格式。用户可以通过双击运行该文件,将其中的键值添加到...
例如,在Windows上可能是`C:\Program Files\Java\jdk版本号\bin`,在macOS或Linux上可能是`/Library/Java/JavaVirtualMachines/jdk版本号.jdk/Contents/Home/bin`。 3. 使用JAD反编译:在命令行中,输入以下命令来...
这里我们有一个名为“linux安装jdk1.8版本”的压缩包,这可能包含了一个预编译的JDK 1.8二进制文件。你需要解压这个文件,可以使用`unzip`命令: ``` unzip linux安装jdk1.8版本.zip ``` 2. **选择安装位置**:...