`
xm_koma
  • 浏览: 383506 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

check class文件的jdk编译版本

    博客分类:
  • Java
 
阅读更多

开发完成后,测试过程中,有时候会报一些莫名的异常。一般都会是:java.lang.NoClassDefFoundError、或者带有

java.lang.ClassNotFoundException。但检查发现我们需要引入的jar包确实存在,而import的类也确实存在。

根据我之前遇到的一种情况是:由于引入的第三方jar包的版本,自身是采用较高的jdk版本编译的(比如:jdk6.0),而当前

项目采用的是较低版本的jdk。为了确定import的类编译的jdk版本,可采用以下方法:

 

编写类:ClassVersionChecker

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

/**
 *  
 * http://www.rgagnon.com/javadetails/java-0544.html  The first 4 bytes are a
 * magic number, 0xCAFEBABe, to identify a valid class file then the next 2
 * bytes identify the class format version (major and minor).
 * 
 * Possible major/minor value :
 * 
 * major minor Java platform version
 * 
 * 45 3 1.0
 * 
 * 45 3 1.1
 * 
 * 46 0 1.2
 * 
 * 47 0 1.3
 * 
 * 48 0 1.4
 * 
 * 49 0 1.5
 * 
 * 50 0 1.6
 * 
 * 
 * @author Administrator
 * 
 */

public class ClassVersionChecker {
	public static void main(String[] args) throws IOException {
		for (int i = 0; i < args.length; i++)
			checkClassVersion(args[i]);
	}

	private static void checkClassVersion(String filename) throws IOException {
		DataInputStream in = new DataInputStream(new FileInputStream(filename));

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

配置args,运行main方法,可以得到该类的major和minor,参照代码注释中的表进行比对,得出编译的jdk版本。

 

如配置一个args[0]为:E:\workspace\whatisjava\bin\VariableBinding.class(snmp4j.jar中的一个class文件)

运行后结果为:E:\workspace\whatisjava\bin\VariableBinding.class: 48 . 0

 

即该类为jdk1.4编译。

 

参考:http://www.rgagnon.com/javadetails/java-0544.html

分享到:
评论

相关推荐

    java反编译工具jad 1.5.8g(可以反编译jdk1.5,1.6)

    java反编译工具jad 1.5.8g支持 jdk1.5,jdk1.6。 说明很多 记住一个万能的命令基本就够用了。 jad -sjava -r -8 -o **\*.class &lt;br&gt;--------------- This is README file for Jad - the fast Java ...

    JAD反编译工具+FrontEnd

    -nodos -不要去检查class文件是否以dos方式写 (CR before NL, default: check) -nocast - 不要生成辅助文件 -nocode -不要生成方法的源代码 -noconv - 不要转换java的定义符 (default: do) -noctor - 不允许空的...

    解决butterknife依赖添加报错

    解决Android studio 添加butterknife依赖,运行报错。

    jdk_1.8_linux_x64

    1. 首先,你需要下载Oracle JDK 1.8的Linux x64版本,文件名为"jdk-8u301-linux-x64.tar.gz"。你可以从Oracle官方网站或者通过wget命令在终端下载: ```bash wget --no-cookies --no-check-certificate --header ...

    java反编译class源码-java-n-IDE-for-Android:java-n-IDE-for-Android

    java反编译class源码Android 上的 Java N-IDE Java 编译器。 概述 这个项目是为了帮助社区在android上学习java而开发的。 您可以使用 JDK 1.7 构建和运行 Java 文件。 在 Google Play 商店下载 去做 Java 编译器 JDK...

    check_as400_1.3.1_already7u3_AS400_

    2. "check_as400.class"、"check_as400_lang.class"、"check_as400_cmd_vars.class":这些都是Java编译后的字节码文件,分别代表了主要的监控逻辑、语言相关的功能和命令变量检查的实现。 3. "0.INSTALLING":这可能...

    native方法详解

    3. 写一个.cpp 文件实现 native 导出方法,其中需要包含第二步产生的.h 文件(注意其中又包含了 JDK 带的 jni.h 文件)。 4. 将第三步的.cpp 文件编译成动态链接库文件。 5. 在 Java 中用 System.loadLibrary() 方法...

    Resin 3.1 配置文件.txt

    这里指定了 Resin 使用内部编译器 (`internal`) 来编译 JSP 页面,并设置了编译器参数 `-source1.5`,表明 Resin 使用 JDK 1.5 的语法特性来编译 JSP。 **8. 安全性配置** 虽然示例代码中未启用安全性配置,但这里...

    ant 配置文件

    &lt;target name="check-jdk-version" if="jdk.version"&gt; &lt;echo message="Using JDK version: ${jdk.version}"/&gt; ``` 六、宏定义(Macrodef) 宏定义允许创建可重用的task集合,提高代码复用性。例如,定义一个打包...

    JVM:早期(编译期)优化的深入理解

    其中,前端编译器将 *.java 文件编译成 *.class 文件的过程。Javac 编译器是 Java 语言编写的程序,源码存放在 JDK_SRC_HOME/langtools/src/share/classes/com/sun/tools/javac 中。 编译过程可以分为三个步骤:...

    resin应用部署详细步骤

    - JDK:本文档中使用的版本为jdk-7-ea-bin-b26-linux-i586-24_apr_2008.bin。 - Resin:使用版本为resin-pro-3.1.12.tar.gz。 #### 三、安装JDK 1. **安装JDK**: - 下载并解压JDK压缩包:`tar -xzvf jdk-7-ea-...

    jni学习例子 在linux下执行成功

    编译后生成的`.class`文件用于Java虚拟机执行。 6. **编译和链接**:`test.o`是`test.c`源文件编译后的目标文件,而`libtest.so`是最终生成的动态链接库,Java会通过`System.loadLibrary`加载这个库,从而调用其中...

    《Java EE企业开发框架》 Spring AOP实验报告

    - **AspectJ**是一种广泛使用的AOP框架,其支持更灵活的切入点表达式以及编译时和运行时的AOP实现。 - 在本实验中,通过Spring集成AspectJ来实现AOP。首先需要在项目的pom.xml文件中添加AspectJ的依赖: ```xml ...

    三分钟教你如何在IDEA中快速创建工程

    接下来,需要指定JDK版本,确保IDEA使用正确的Java运行环境。 3. 设置显示常见的视图 IDEA提供了丰富的视图来满足不同开发需求,如Project、Structure、Favorites、Navigation Bar等。可以根据个人习惯设置显示...

    MyEclipse 6 Java 开发中文教程

    2. 配置JDK:在安装过程中或安装完成后,需要配置MyEclipse识别的JDK路径,确保开发环境中Java环境的正确设置。 3. 更新插件:安装后,可通过Help &gt; Check for Updates来更新MyEclipse的组件,保持软件的最新状态。 ...

    JAVA英语单词(带音标).

    - **JDK: Java development kit, java开发工具包**:包含了编译、调试、运行Java程序所需的各种工具。 - **JVM: java virtual machine, java虚拟机**:一个可以执行字节码的虚拟机实例,是Java程序运行的基础。 ###...

Global site tag (gtag.js) - Google Analytics