`

Java class文件的JDK编译版本号

    博客分类:
  • Java
 
阅读更多

本人转载自新浪博客,原文地址:http://blog.sina.com.cn/s/blog_437ff56b0100r22z.html

 

 需要用可打开二进制文件的软件来打开,不要用文本方式打开或其他文本编辑器打开。

  比如用UltraEdit(UE)打开class文件(如果是在linux,比如Ubuntu下,用$ hexdump -C Test.class),你会看到诸如第一行是:

 

  00000000h: CA FE BA BE 00 00 00 32 00 A9 07 00 02 01 00 37

 

 前四个字节为固定的 CA FE BA BE ,接下来的四个字节为次版本号(0000)和主版本号(00032)。

  33:JDK1.7

  32:JDK1.6

  31:JDK1.5

  30:JDK1.4

  2F:JDK1.3


现在不妨从 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 的因素)

 

分享到:
评论

相关推荐

    java jdk8 学习笔记

    9.java se development 8uN ,其中N是JDK更新版本号。 10.java安装时要理解这三个东西,安装是否成功输入java 命令测试一下工具是否可用。 11.java安装目录详解https://zhidao.baidu.com/question/181908777.html ...

    java反编译工具及eclipse插件

    1.将class文件反编译为java文件的工具jad.exe 2.eclipse的反编译插件net.sf.jadclipse_3.3.0.jar(方便查看源代码) 插件安装方法:  1、下载eclipse插件:jadclipse_3.1.0.jarhttp://jadclipse.sourceforge.net/ ...

    decomp反编译工具

    超好用的反编译工具,支持class文件jdk版本号查看

    JAVA学生管理系统

    现在就可以将StudentManager.jar拷贝到任何一个安装了java运行环境(jdk版本号须高于1.2.2)的计算机上,只要鼠标双击StudentManager.jar文件就可以运行该java应用程序了。 注意在装了WinRAR解压缩软件的机子上...

    jd_gui jad eclipse 反编译工具

    插件安装方法:  1、下载eclipse插件:jadclipse_3.1.0.jarhttp://jadclipse.sourceforge.net/  2、 下载Jad反编译工具:jad.exehttp://... 注意:jadclipse_3.1.0.jar的版本与eclipse的platform版本号相关

    Java反编译Jad大全:jad.1.5.8+net.sf.jadclipse_3.3.0+配置方法

    代表版本号)复制到%ECLIPSE_HOME%\plugins目录下。 方法2、使用link方式安装,建立D:\Myplugins\jadclipse3.2.4\eclipse\plugins的目录结构,将jadclipse_3.2.4.jar放到plugins目录下面(注:其中D:\Myplugins...

    Java课程设计案例精编:Java课程设计案例精编.ISO

    *.java命令进行编译(其中-classpath用来告诉编译器用户Java文件的路径,“ . ”表示*.java文件的路径在当前目录位置,注意点的前后均有一个空格)。经过编译产生*.class文件后,在C:\temp>提示符下使用java –...

    将java程序打包成可执行文件

    第5步 : 先别管上面的,先在下面单击绿色的“+”号,在弹出的窗口中点Archive,然后找到起初已经做好的 CAMP_fat.jar(详见1.3)文件,"OK"后返回,在下面的Class Path里就出现jar文件路径后,再在上面Main Class栏...

    readyAPI1.41最新半破解版

    有源码,有class文件和jar文件. 没有完全破解. 其实soapui 4.5的破解文件通杀所有soapui和soapui ng(不包括readyapi,loadui...) 1,破解方法有多种(我只是修改了一些...readyapi中 soapui内部版本号为6.0,外部版本号为5.2

    第2章 Java语言开发环境(第7版),讲解Java的开发环境部署

    第2章 Java语言开发环境(第7版),讲解Java的开发环境部署。 1.安装JDK 安装JDK的同时会安装JRE ...打开运行窗口输入cmd回车,弹出窗口输入“javac -version”回车后弹出命令是javac+版本号那就证明环境配置成功了

    monkey环境搭建

    java -version 出现jdk版本号,ps:注意java和javac都是命令(动词),后面-version可理解为宾语,中间是有空格的,切记!!! 特别注意: 在 cmd 中,输入 set java_home命令可以看到jdk安装目录; set path ...

    疯狂JAVA讲义

    学生提问:当我们使用编译C程序时,不仅需要指定存放目标文件的位置,也需要指定目标文件的文件名,这里使用javac编译Java程序时怎么不需要指定目标文件的文件名呢? 13 1.5.3 运行Java程序 14 1.5.4 根据...

    soapui cookie处理方式

    改造源码使它支持 内含源码和class,在jdk8下编译 自己来编译(eclipse下新建一个工程,把soapUI的所有... 替换 soapui-****版本号*****.jar 中对应的class 理论支持所有版本 (readyAPI也支持 ready-api-soapui-***.jar)

    新版Android开发教程.rar

    蓝牙 (class 1) ;四频 (850 , 900 , 1800 , 1900) ;支持 3G , 802.11b 和 802.11g 。----------------------------------- Android 编程基础 5 互联网 支持 HTTP 、 WAP Push 和 xHTML ;支持 POP 、 IMAP 、 ...

    java课程设计班级通讯录设计报告.doc

    系统运行环境为运行Windows,具有JDK1.7以上Java编译环境和Eclipse3.0以上Java 编辑环境,Navicat for MySQL。 3. 系统设计 1. 系统总体设计 进入系统后必须先进行登陆。登陆成功后,即可进入通讯簿主界面。在主...

    maven的优缺点 项目

    建议不要写版本号,默认下载最新版本 --> <!-- 跳过测试 --> <groupId>org.apache.maven.plugins <artifactId>maven-surefire-plugin <!-- true表示跳过测试类 --> <skip>...

    exe4j_windows_4_4_6

    第5步,先别管上面的,先在下面单击绿色的“+”号,在弹出的窗口中点Archive,然后找到起初已经做好的CAMP_fat.jar(详见1.3)文件,"OK"后返回,在下面的Class Path里就出现jar文件路径后,再在上面Main Class栏内...

    jdbc基础和参考

    从Jdk6.0以后要求,JDBC 4.0 Drivers 必须包括 META-INF/services/java.sql.Driver 文件,有了这个文件以后不需要在显示的使用Class.forName来进行驱动的注册 Oracle数据库进行连接的时候,使用的驱动类: 1....

    iuhyiuhkjh908u0980

    使用脚本,将工程的所有.class文件(除了Junit的)进行instrument,然后直接覆盖tomcat/webapp中该工程的.class文件. 2.把instrument时候生成的cobertura.ser考到tomcat/bin下面. 3.启动tomcat(在Eclipse中启动),并通过...

Global site tag (gtag.js) - Google Analytics