由这个错误来解释java class file内部结构。

java.lang.UnsupportedClassVersionError: HelloWorld :
 Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(Unknown Source)

这个错误往往是编辑的jdk版本和运行时的jdk版本不一致的情况下引起的。这个异常指出了该class file的版本51.0。当在某一个java版本改变了java class文件结构,其他版本就可以能不能运行该class文件,往往需要相匹配的jdk来运行或重新编译Java文件生成新的class文件。或者编译的时候指定target格式, 如:

javac -target 1.4 HelloWorld.java

Sun Java class 文件版本号与对应的JDK版本如下:

J2SE 8 = 52,
J2SE 7 = 51,
J2SE 6.0 = 50,
J2SE 5.0 = 49,
JDK 1.4 = 48,
JDK 1.3 = 47,
JDK 1.2 = 46,
JDK 1.1 = 45

一个ClassFile的格式如下:

struct Class_File_Format {
   u4 magic_number;  //1. 杂志号: 0xCAFEBABE
   u2 minor_version;   //2. 小版本
   u2 major_version;   //3.主版本号
   u2 constant_pool_count;   //4. CP数  
   cp_info constant_pool[constant_pool_count - 1]; //5. CP info
   u2 access_flags; //6. access flag
   u2 this_class;     //7. this
   u2 super_class;  //8. supper
   u2 interfaces_count;   //9.interface数
   u2 interfaces[interfaces_count]; //10. interface数组
   u2 fields_count;   //11. 字段数
   field_info fields[fields_count]; //12. 字段信息
   u2 methods_count; //13. 方法数
   method_info methods[methods_count]; //14.具体方法信息
   u2 attributes_count;   //15.属性数
   attribute_info attributes[attributes_count]; //16.属性信息
}

在JVM内核<<Inside the Java Virtual Machine>> By Bill Venners一书的第6节中详细介绍了java class file.

同时可以参考wiki: https://en.wikipedia.org/wiki/Java_class_file

发表评论