`
810364804
  • 浏览: 783883 次
文章分类
社区版块
存档分类
最新评论

CMD中查看CLASS文件编译的JDK版本

 
阅读更多

javap -verbose classname

会输出一些信息,大致如下:

Compiled from "HtmlCrawer.java"

public class org.eagleeye.html.HtmlCrawer extends java.lang.Object

SourceFile: "HtmlCrawer.java"

minor version: 0

major version: 50

Constant pool:

const #1 = class #2; // org/eagleeye/html/HtmlCrawer

const #2 = Asciz org/eagleeye/html/HtmlCrawer;

const #3 = class #4; // java/lang/Object

const #4 = Asciz java/lang/Object;

const #5 = Asciz client;....

后面省略了,可以看到前面有两行:

minor version:

0major version: 50

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的class文件的简单方法,附"文件分割器"完整源代码

    我将class文件FileSa.class和jad放在E盘根目录下; 打开“命令提示符”快捷键操作:WIN+R; 再依次如下几步: cmd 回车; cd /d E: 回车; jad -sjava FileSa.class 回车; 此时E盘目录下会生成一个FileSa....

    拖拽编译java及运行class批处理.rar

    3.拖拽单个 *.java 文件到下面批处理,是把 java 文件编译为 class 文件。 【★★★java 编译为 class★★★】.cmd 4.拖拽单个 *.class 文件到下面批处理,是运行 class 程序。 【★★★ 运行 class 程序...

    Java快速编译工具

    优点:本程序不需要用户手动敲击CMD命令,只需在图形界面上用鼠标点击即可方便地编译Java源程序,并可自定义class文件的存储位置。同时,在用户点击编译、运行等按钮时,会自动生成相应的CMD命令并通过对话框显示...

    myeclipse进行及时反编译的jad插件

    第二歩将jad.exe放进\Java\jdk1.7.0\jre\bin目录下,如果环境变量设置的没有问题,那么在cmd中输入jad,回车会发现jad命令已经可以使用了;第三步:将net.sf.jadclipse_3.3.0.jar放到 MyEclipse 6.5目录下\eclipse\...

    java反编译工具

    1、将jad.exe文件放入jdk和jre的bin目录下。 2、将net.sf.jadclipse_3.3.0.jar文件放入eclipse里面的plugins目录下,如果是myeclipse则将该文件同时放入心下两个目录 a、XXX\MyEclipse\eclipse\plugins。 b、XXX\...

    MyEclipse6.5配置反编译插件

    MyEclipse6.5配置反编译插件 文章分类:Java编程 ...MyEclipse6.5的反编译插件的安装 我的MyEclipse6.5的安 装目录是D:\MyEclipse 6.5,以下仅供参考 ...导入一个工程测试,双击一 个*.class的文件,你将会看到效果了。

    北京圣思源JAVA课程笔记(全)

    ava SE 第一讲: Java SE:Java Standard Edition Java ME: Java Mobile Edition Java EE:Java Enterprise Edition ...Class 文件是字节码文件,程序最终执行的就是这个字节码(bytecode)文件。

    myeclipse6.5 反编译工具 jadclipse jad

    eclipse3.3 反编译工具 MyEclipse6.5的反编译插件的安装 序:我的MyEclipse6.5的安装目录是D:\Program Files\...导入一个工程测试,双击一个*.class的文件,你将会看到效果了 尾:如果安装成功了,快谢谢我哦!

    java环境搭建文档

    java环境变量搭建 ////////////////////////////////////... 将java原代码文件.java编译成字节码文件.class java -version 显示当前jdk版本 //////////////////////////////////////////////////////////////////////

    使用C++语言实现基于JVMTI机制的 JAVA 代码 加密保护工具

    众所周知,Java编译后的Jar包和Class文件,可以轻而易举的使用反编译工具(如JD-GUI)进行反编译,拿到源码。为了保护自己发布的Jar包和Class文件,采用的方式大多是混淆方式,这种方式对于Class文件的加密是不彻底...

    monkey环境搭建

    3.添加CLASSPATH变量为java加载类的(class or lib)路径,(这样java虚拟机装载class文件的时候才知道上哪去找只有类在classpath中,java命令才能识别) 设为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar (要加....

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

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

    yaml-payload:Spring Cloud SnakeYAML反序列化一键注入cmdshell和reGeorg

    自述文件Spring Cloud SnakeYAML...利用方法如下:编译class文件然后打jar包cd yaml-payloadjavac src/artsploit/AwesomeScriptEngineFactory.java -cp ./libjavac src/artsploit/Tunnel.java -cp ./libjavac src/artsp

    corejava基础重要知识点总结

    PATH=C:\Program Files\Java\jdk1.6.0_45\bin(javac.exe->编译指令 java.exe -》运行指令) CLASSPATH:类加载器使用 让类加载器明确去哪里加载.class文件 通常不需要设置 默认值:. .:当前目录(.java) ...

    JAVA实验报告一.docx

    配置成功截图: 图1.1 显示java的版本信息图 简单的程序设计: 题目1:在屏幕上打印"Hello World" 程序代码: public class Test { public static void main(String args[]){ System.out.print("Hello world!...

    Java4Android开发教程(二)hello world!

    编译完之后会出现class文件 注意: 1、public class 后的字母要和文件名大小写对应起来,注意字符的大小写 2、成对出现的符号如大括号、小括号等一次性写一对 3、遇到大括号{}用tab键来缩进,养成良好的缩进习惯 ...

    TR069-OPENACS服务器搭建.doc

    TR069 Openacs服务器搭建 目录 一、安装JDK 3 二、安装MySQL数据库及驱动 5 三、JBOSS服务器 13 四、在ANT下编译ACS源码 16 五、在JBOSS中部署编译后的openacs项目 19 六、OPENACS操作简要手册 22 1 、CPE的设置 22 ...

    新版Android开发教程.rar

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

    ant使用基础啊

    1),安装jdk,设置JAVA_HOME ,PATH ,CLASS_PATH(这些应该是看这篇文章的人应该知道的) 2),下载ant 地址http://www.apache.org/找一个你喜欢的版本,或者干脆最新的版本 3),解压ant 你得到的是一个压缩包,解压缩它,...

    【05-面向对象(下)】

    •JDk还提供了自动装箱和自动拆箱。自动装箱就是把一个基本类型的变量直接赋给对应的包装类变量,自动拆箱 则与之相反。 •包装类还可以实现基本类型变量和字符串之间的转换,除了Character之外的所有包装类都...

Global site tag (gtag.js) - Google Analytics