Win a copy of Programmer's Guide to Java SE 8 Oracle Certified Associate (OCA) this week in the OCAJP forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

which jdk was used to compile this class?

 
seb petterson
Ranch Hand
Posts: 118
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I am just wondering how I can find out which jdk (vendor and version) was used to compile a certain class.

Seb
 
Jean-Sebastien Abella
Ranch Hand
Posts: 60
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
first 4 bytes of file is 0xCAFEBABE
then next 4 is the version....
have a look at this web site
ClassFile specification
 
seb petterson
Ranch Hand
Posts: 118
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
Originally posted by Jean-Sebastien Abella:
first 4 bytes of file is 0xCAFEBABE
then next 4 is the version....
have a look at this web site
ClassFile specification


Thank you, so if the next four bytes are: 0000 002e what version is that? 1.4.3.2?

Do you know if the vendor is hiding there somewhere too?
[ August 12, 2005: Message edited by: seb petterson ]
 
Jim Yingst
Wanderer
Sheriff
Posts: 18671
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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 ]
 
Jim Yingst
Wanderer
Sheriff
Posts: 18671
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
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.)
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic