由这个错误来解释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