As a shortcut you can get the info Jean-Sebastien just referred to using javap:
javap -verbose ClassName
The major and minor version appear near the beginning of the output. Unfortunately the numbers that you get here are not the same as the JDK version. E.g. for a file compiled using JDK 1.5.0_04, I get the class file version as 49.0. I these numbers correlate to specific JDKs. However it's difficult to find the documentation allowing us to determine exactly what this correlation is. There's some info in a footnote here, with a partly-updated version here (found via Clarifications and Amendments to the Java Virtual Machine Specification). The relevant info is in the footnote on p. 95: "For k >= 2 implementations of version 1.k of the Java 2 platform can support class file formats of versions in the range 45.0 through 44+k.0 inclusive." Yeesh. Couldn't they just put a nice table somewhere?
Anyway, that basically means that JDK 1.2 compiles to class file format 46.0; JDK 1.3 is 47.0; 1.4 is 48.0 and 49.0. (Unless you compile using the -target modifier to specify a different version.) I'm not sure if the minor version (the .0) is really used any more; seems like the answer is no. You can experiment using different versions of JDK 1.4.X to verify this.
I don't think there's any way to identify the vendor of the compiler from the class file, or to tell the difference between JDK 1.5.0_01 and JDK 1.5.0_04, for example.
Of course, if we had a knowledgeable compiler author on hand in the forum this week, they may be able to provide better info. [ August 12, 2005: Message edited by: Jim Yingst ]
"I'm not back." - Bill Harding, Twister
Joined: Jan 30, 2000
0000 002e is hexadecimal for 2*16 + 14 = 46. Looks like it was compiled using JDK 1.2. (Which was actually called an SDK I guess, but never mind.)