开发完成后,测试过程中,有时候会报一些莫名的异常。一般都会是: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,jdk1.6。 说明很多 记住一个万能的命令基本就够用了。 jad -sjava -r -8 -o **\*.class <br>--------------- This is README file for Jad - the fast Java ...
-nodos -不要去检查class文件是否以dos方式写 (CR before NL, default: check) -nocast - 不要生成辅助文件 -nocode -不要生成方法的源代码 -noconv - 不要转换java的定义符 (default: do) -noctor - 不允许空的...
解决Android studio 添加butterknife依赖,运行报错。
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源码Android 上的 Java N-IDE Java 编译器。 概述 这个项目是为了帮助社区在android上学习java而开发的。 您可以使用 JDK 1.7 构建和运行 Java 文件。 在 Google Play 商店下载 去做 Java 编译器 JDK...
2. "check_as400.class"、"check_as400_lang.class"、"check_as400_cmd_vars.class":这些都是Java编译后的字节码文件,分别代表了主要的监控逻辑、语言相关的功能和命令变量检查的实现。 3. "0.INSTALLING":这可能...
3. 写一个.cpp 文件实现 native 导出方法,其中需要包含第二步产生的.h 文件(注意其中又包含了 JDK 带的 jni.h 文件)。 4. 将第三步的.cpp 文件编译成动态链接库文件。 5. 在 Java 中用 System.loadLibrary() 方法...
这里指定了 Resin 使用内部编译器 (`internal`) 来编译 JSP 页面,并设置了编译器参数 `-source1.5`,表明 Resin 使用 JDK 1.5 的语法特性来编译 JSP。 **8. 安全性配置** 虽然示例代码中未启用安全性配置,但这里...
<target name="check-jdk-version" if="jdk.version"> <echo message="Using JDK version: ${jdk.version}"/> ``` 六、宏定义(Macrodef) 宏定义允许创建可重用的task集合,提高代码复用性。例如,定义一个打包...
其中,前端编译器将 *.java 文件编译成 *.class 文件的过程。Javac 编译器是 Java 语言编写的程序,源码存放在 JDK_SRC_HOME/langtools/src/share/classes/com/sun/tools/javac 中。 编译过程可以分为三个步骤:...
- 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-...
编译后生成的`.class`文件用于Java虚拟机执行。 6. **编译和链接**:`test.o`是`test.c`源文件编译后的目标文件,而`libtest.so`是最终生成的动态链接库,Java会通过`System.loadLibrary`加载这个库,从而调用其中...
- **AspectJ**是一种广泛使用的AOP框架,其支持更灵活的切入点表达式以及编译时和运行时的AOP实现。 - 在本实验中,通过Spring集成AspectJ来实现AOP。首先需要在项目的pom.xml文件中添加AspectJ的依赖: ```xml ...
接下来,需要指定JDK版本,确保IDEA使用正确的Java运行环境。 3. 设置显示常见的视图 IDEA提供了丰富的视图来满足不同开发需求,如Project、Structure、Favorites、Navigation Bar等。可以根据个人习惯设置显示...
2. 配置JDK:在安装过程中或安装完成后,需要配置MyEclipse识别的JDK路径,确保开发环境中Java环境的正确设置。 3. 更新插件:安装后,可通过Help > Check for Updates来更新MyEclipse的组件,保持软件的最新状态。 ...
- **JDK: Java development kit, java开发工具包**:包含了编译、调试、运行Java程序所需的各种工具。 - **JVM: java virtual machine, java虚拟机**:一个可以执行字节码的虚拟机实例,是Java程序运行的基础。 ###...