打印class文件的Java编译器内部的版本号

 

当改变了jdk版本时,在编译java时,会遇到Unsupported major.minor version错误。
错误信息如下 :

Unsupported major.minor version 50.0
Unsupported major.minor version 49.0 (我在jdk1.4 和1.5切换时就遇到了这个错误)
Unsupported major.minor version 48.0

二、错误原因:

类似错误均属于Java版本问题,即JDK版本过低,只要选择相对应的JDK版本编译即可。
48,49,50是Java编译器内部的版本号:
Unsupported major.minor version 50.0 对应于 JDK1.6(JRE1.6)
Unsupported major.minor version 49.0 对应于 JDK1.5(JRE1.5)
Unsupported major.minor version 48.0 对应于 JDK1.4(JRE1.4)

 

import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class ClassVersionChecker {
    public static void main(String[] args) throws IOException {
        System.out.println(System.getProperty("java.version"));
        String canonicalName = ClassVersionChecker.class.getCanonicalName();
        String classPathSeparate = "/";
        String extension = ".class";
        String path = ClassVersionChecker.class.getResource(classPathSeparate + canonicalName.replace(".", classPathSeparate) + extension).getPath();
        File file = new File(path);
        checkClassVersion(file);
    }

    private static void checkClassVersion(File classFile)
            throws IOException {
        DataInputStream in = new DataInputStream
                (new FileInputStream(classFile));

        int magic = in.readInt();
        if (magic != 0xcafebabe) {
            System.out.println(classFile.getName() + " is not a valid class!");
        }
        int minor = in.readUnsignedShort();
        int major = in.readUnsignedShort();
        System.out.println(classFile.getName() + ": " + major + " . " + minor);
        in.close();
    }
} 

 

JDK1.8:

1.8.0_65
ClassVersionChecker.class: 52 . 0

 

JDK1.6:

1.6.0_45
ClassVersionChecker.class: 50 . 0

 

 

如果可以拿到源代码,用当前环境JDK重新编译,再运行即可。(记得使用 -target -source 参数)

如果拿不到源代码,就要确认classes的编译器本版,然后用该版本运行。

下面是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

 

时间: 2024-10-31 02:27:55

打印class文件的Java编译器内部的版本号的相关文章

java调用本地打印机实现打印PDF文件,怎么做?

问题描述 使用java语言进行多个PDF文件的打印,需要给打印机设置参数,如打印机名称,图纸尺寸等 解决方案 解决方案二:调用默认的打印机,Runtime.getRuntime().exec("cmd.exe/Cstartacrord32/h/p"+"D:\xxxxx.pdf");解决方案三: 解决方案四: 解决方案五:我需要传参数,不是调用默认打印机,用户可以选择的解决方案六:publicclassPrintPdf{publicstaticvoidmain(Str

服务器-BS系统 java web打印word文件或者word文件流

问题描述 BS系统 java web打印word文件或者word文件流 BS系统.在服务器存有多个word文件.要求在页面点击打印直接打印. 用户点击打印能够选择打印那些文件,并且能够控制份数. (PS:文件是用户上传的,无法写死) 解决方案 客户端安装word,然后下载打印,否则没办法做到精确.浏览器有自己的打印设置.

Java虚拟机内部体系结构(摘记,待完善):)

Java虚拟机体内部系结构包括class文件.类装载子系统.运行时数据区.之行引擎.本地方法调用结构,其中运行时数据区包括方法区.堆.Java栈.程序计数器.本地方法栈等.具体结构如下图所示(摘自Inside Java Virtual Machine):   1.       class文件 在Java中,所有源文件都编译成二进制的字节码,然后由虚拟机装载运行.一般这样的字节码是以class文件的形式存在.在运行时,由ClassLoader类(System ClassLoader or User

Java SE 6.0调用Java编译器的两种新方法

在很多Java应用中需要在程序中调用Java编译器来编译和运行.但在早期的版本中(Java SE5及以前版本)中只能通过tools.jar中的com.sun.tools.javac包来调用Java编译器,但由于tools.jar不是标准的Java库,在使用时必须要设置这个jar的路径.而在Java SE6中为我们提供了标准的包来操作Java编译器,这就是javax.tools包.使用这个包,我们可以不用将jar文件路径添加到classpath中了. 一.使用JavaCompiler接口来编译Ja

编码准则与Java编译器

我们在写代码时,常常会提到两条原则: 1.方法要尽量短,大方法要分解成小方法: 2.不要重复发明轮子. 我们在强调这两个原则的时候,往往只关注的是代码简洁.易维护等方便我们人的因素,其实这样做还可以大大方便java编译器优化代码. Java编译器优化简介 Java应用程序的编译过程与静态编译语言(例如C或C++)不同.静态编译器直接把源代码转换成可以直接在目标平台上执行的机器代码,不同的硬件平台要求不同的编译器.Java编译器把Java源代码转换成可移植的JVM字节码.与静态编译器不同,java

JVM深入学习笔记一:Java 编译器初探

闲来无事想大概看下Java编译器的执行过程 一. 编译一个文件 首先去搞到源代码.从JDK6开始Java代码开源,放到OPENJDK组织中去,所以从这个网站进行下载: http://hg.openjdk.java.net/jdk6/jdk6/langtools/  下载之后是一个zip包,解压,可以直接导入到eclipse中进行使用,导入之后可能会报错,需要设置一下. 好,下面写一个用作测试的类: import java.util.Arrays; import java.util.List; i

IDEA中调试Java编译器小结

之前有介绍过在NetBeans里面调式HotSpot,今天记录下怎么在IDEA里面调试Java编译器,也就是javac. 首先我们要先拿到javac的代码,它是在hotspot的子工程langtools里面,clone下来先, hg clone http://hg.openjdk.java.net/jdk7u/jdk7u/langtools 然后找到javac的代码入口,com.sun.tools.javac.main.Main. 为了偷懒我直接在这个类里面加了main方法, public st

java编译器顺序-java读取代码顺序是从左往右还是从右往左

问题描述 java读取代码顺序是从左往右还是从右往左 java编译器读取每行代码顺序是从左往右还是从右往左 例如 int a=1; int b=2; int c=3; int d=a+b*c int d=a+b*c是从左往右读取还是按优先级读取 编译器读取每行代码都是从左往右读取吗 解决方案 也许你觉得从左到右是很天经地义的事情. 偏偏阿拉伯文就是从右到左的. 我们知道,windows.office这些软件都有阿拉伯语言的版本,也能正确处理这些语言. 那么微软是否需要为这些国家或者地区的人重新设

含html文件的java程序打包后的问题

问题描述 含html文件的java程序打包后的问题 控件是EditorPane,显示内容为.htm文件,来源是word转换的htm文件,使用的方法是setpage():左边是编码调试阶段的情况,右边是打包后程序运行后的情况.请问为什么打包后出现的是htm的内部代码而不是外观?