minor.major version 详解

转载 2011年01月23日 21:23:00

本文转自: http://blog.csdn.net/xiaxiaorui2003/archive/2009/07/07/4327029.aspx

 

 

从 JDK 1.1 到 JDK 1.7 编译器编译出的 class 的默认 minor.major version,如下表所示:

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

 

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 的因素)

VS_VERSION_INFO信息的读取

最近在整理东西,打算把一些小东西分类整理下,与大家分享一下: 很早以前用MFC开始在做工业软件时,经常会遇到版本备份啊什么之类的问题,那时候,不太懂,后来研究了一下API,发现了如何读取VS_VER...
  • opahlu
  • opahlu
  • 2013年02月05日 21:56
  • 2419

IOS应用开发版本控制工具之Versions 和SVN 的 使用方法详解

http://ytwhw.iteye.com/blog/1753954 Versions版本控制工具破解版(Versions.zip)下载请见本博文附件。下载后在MAC安装完以后,图标是莲花状...
  • jeffasd
  • jeffasd
  • 2016年01月13日 14:53
  • 8571

java -version和javac -version不一样的原因及解决办法

上篇幅介绍了启动eclipse遇到的问题,这个篇幅就好好讲讲,在cmd中java -version和javac -version 不一样的原因和解决办法。...
  • zp357252539
  • zp357252539
  • 2016年12月28日 07:35
  • 882

ubuntu+cuda安装问题总结

1.安装ssh服务器 1)更新资源列表 打开”终端窗口”,输入”sudo apt-get update”–>回车–>”输入当前登录用户的管理员密码”–>回车 2)安装ssh服务器 打开”终端窗...
  • cv_family_z
  • cv_family_z
  • 2016年08月03日 11:30
  • 6597

hibernate使用version实现乐观锁

乐观锁的作用  乐观锁的主要作用是为了解决事务并发带来的问题。相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。 悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的...
  • cxn945
  • cxn945
  • 2015年06月24日 14:51
  • 922

dex2jar源码解析----解析dex文件<三>

接上篇,我们从convertCode开始看 public void convertCode(DexMethodNode methodNode, MethodVisitor mv) { ...
  • new_abc
  • new_abc
  • 2016年12月21日 20:57
  • 565

Hibernate 乐观锁实现之 Version

通过在表中及POJO中增加一个Timestamp字段来表示记录的最后更新时间,来达到多用户同时更改一条数据的冲突,这个timestamp由数据库自动添加,无需人工干预 数据库结构:   ...
  • z69183787
  • z69183787
  • 2014年04月03日 06:50
  • 7446

关于内核模块挂载出现“no symbol version for”问题的研究

http://blog.chinaunix.net/uid-20543672-id-3023148.html 前几天一个同事问我:如果一个模块要调用另一个模块的函数,要不要做什么特别的处...
  • hshl1214
  • hshl1214
  • 2013年04月07日 19:05
  • 7418

Android自动打包工具aapt详解

概念在Android.mk中有LOCAL_AAPT_FLAGS配置项,在gradle中也有aaptOptions,那么aapt到底是干什么的呢? aapt即Android Asset Packag...
  • xiangzhihong8
  • xiangzhihong8
  • 2016年12月13日 11:13
  • 5480

关于 dotnetframework不同版本兼容性的屁小的事情

背景:最近公司要将太平洋东岸的一个项目搬到mainland这边,但大陆有用大恒水星系列的工业相机,但原来的项目对工业相机没有作支持,只好临时加上;但水星的SDK是dotnet3.5;而公司的项目是do...
  • wilsonke
  • wilsonke
  • 2016年04月01日 01:18
  • 2328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: minor.major version 详解
举报原因:
原因补充:

(最多只允许输入30个字)