本人转载自新浪博客,原文地址: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 的因素)
分享到:
相关推荐
标题提到的是一个针对 JDK 1.8 版本的 Java 反编译工具,这表明该工具兼容 Java 8 的字节码,能够在不拥有源代码的情况下查看和理解类文件的实现细节。描述中提到了作者在寻找可用的工具过程中遇到困难,最终找到并...
1. **Java编译器**(javac):负责将源代码(.java文件)编译成字节码(.class文件),这是运行在JVM上的程序。 2. **Java虚拟机**(JVM):JVM是Java程序的运行引擎,它解释并执行.class文件,实现跨平台的“一次...
1. **Java编译器** (javac): 它将源代码(.java文件)转换为Java字节码(.class文件),这是Java平台可执行的二进制形式。字节码可以在任何支持Java的平台上运行,因为JVM会解释并执行它。 2. **Java解释器** (java...
通常,JDK的安装路径可能是`C:\Program Files\Java\jdk版本号\bin`(Windows)或者`/usr/lib/jvm/java-版本号-openjdk-amd64/bin`(Linux或MacOS)。 接下来,为了在Eclipse中集成JAD,你需要下载并安装`...
标题中的“jdk双版本.zip”表明这是一个包含两个不同平台版本的Java Development Kit(JDK)的压缩文件。JDK是Java编程语言的核心组件,它提供了编译、调试和运行Java应用程序所需的所有工具和库。 首先,我们来看...
Java 编译器(javac):用于将 Java 源代码编译成 Java 字节码,也就是 .class 文件。 Java 虚拟机(JVM):负责解释执行 Java 字节码,并将其转换为特定硬件平台的机器码。 Java 运行时环境(JRE):包含 Java ...
9.java se development 8uN ,其中N是JDK更新版本号。 10.java安装时要理解这三个东西,安装是否成功输入java 命令测试一下工具是否可用。 11.java安装目录详解https://zhidao.baidu.com/question/181908777.html ...
1.将class文件反编译为java文件的工具jad.exe 2.eclipse的反编译插件net.sf.jadclipse_3.3.0.jar(方便查看源代码) 插件安装方法: 1、下载eclipse插件:jadclipse_3.1.0.jarhttp://jadclipse.sourceforge.net/ ...
- `javac`: Java编译器,将源代码编译为字节码(`.class`文件)。 - `java`: Java解释器,用于运行编译后的Java程序。 - `javadoc`: 生成API文档的工具,将源代码中的注释转化为HTML格式。 - `jar`: 打包和管理...
2. **版本号**:紧跟魔数之后的是两个无符号短整数,分别为**次要版本号(Minor Version)**和**主要版本号(Major Version)**,它们指示了Class文件所对应的JDK版本。例如,版本号0x34对应于JDK 1.8。 3. **常量...
- **java**:Java解释器,用于执行编译后的.class文件。 - **javap**:反汇编器,显示关于类文件的详细信息。 2. **JRE (Java Runtime Environment)** JRE是运行Java应用程序所需的环境,包括Java虚拟机(JVM)...
例如,在Windows上可能是`C:\Program Files\Java\jdk版本号\bin`,在macOS或Linux上可能是`/Library/Java/JavaVirtualMachines/jdk版本号.jdk/Contents/Home/bin`。 3. 使用JAD反编译:在命令行中,输入以下命令来...
Java 获取版本号及字节码编译版本方法示例 Java 获取版本号及字节码编译版本方法示例主要是介绍了关于 Java 获得版本号及字节码编译版本的相关资料。通过示例代码,详细介绍了获取 Java 版本号和字节码编译版本的...
首先,它提供了Java编译器(javac),开发者可以使用这个编译器将源代码(.java文件)转化为字节码(.class文件)。字节码是Java虚拟机(JVM)能够理解和执行的语言。其次,JDK包含Java运行时环境(JRE),使得用户...
Java反编译神器,顾名思义,是一种用于解析和理解Java字节码的工具,主要目的是让开发者能够查看已编译的Java类文件(.class文件)的源代码,即使原始的源代码已丢失或不可用。在软件开发过程中,这种能力可以用于...
当我们提到"Class反编译"时,通常指的是将Java的.class文件转换回可读的源代码形式。下面我们将详细探讨这个过程所需的工具和jar包。 首先,我们要介绍的是JAD(Java Decompiler)。JAD是一款非常流行的开源Java反...
例如,`javac`命令用于将源代码(.java文件)编译成字节码(.class文件),`java`命令用于运行编译后的Java程序,`jdb`用于调试Java程序,`jar`工具则用于打包和管理类库。 对于Java开发者来说,保持JDK更新至最新...
2. 文件版本:接着是两个2字节的次版本号和主版本号,用于标识Class文件的版本,与JVM的版本对应,确保兼容性。 3. 表结构:表是Class文件的核心,包括常量池表、访问标志表、类索引、父类索引、接口索引集合、字段...
Java Launcher 3.2 是一款专门针对Java程序的反编译工具,它允许开发者查看和理解已编译的.class文件的原始源代码。在软件开发过程中,有时我们可能需要查看或分析已发布的Java应用程序,而原始源代码并不可用。这时...