我偶然发现了一组旧的课程,日期为1997年3月。那时我尝试学习Java,使用的是JDK 1.0.2。
有趣的是,我保存了源文件和类文件,它们至今仍可以被编译和执行,这真的很酷。但是Java不应该保持二进制兼容性吗?在某个地方,这种格式不再有效了。Java 8虚拟机将会报告;
Exception in thread "main" java.lang.ClassFormatError: Invalid start_pc 65535 in LocalVariableTable in class file bali/core/Application
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
:
[snip many ClassLoader calls]
:
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
有问题的类是我从命令行调用的类的超类。
还有一个细节,在那些日子里,微软仍然在Java阵营中,我记得他们的javac更符合不良语法。Sun编译器很乐意接受“public synchronized class Abc”和许多其他无效语句。因此,这些类文件很可能是由MS编译器生成的,然后在Sun JVM上运行。
无论如何,我的问题是:是否有人了解早期Java版本中的兼容性承诺?这是一件大事,还是有意放弃?或者是在更晚的版本,比如Java 1.4或Java 5中做出的决定,简单地放弃了JDK 1.0支持?
javap
反汇编这个类吗? - biziclop