如何知道java类是由jdk 64bit还是32bit版本编译的?

时间:2015-08-12 06:55:48

标签: java

给定一个java类文件,我们可以使用hexdump或od来了解它的jdk版本,但是我们可以知道给定java类文件的64位或32位信息吗?

我想知道java类文件是否有像version field这样的字段?

如果字节码与字大小无关,那么当您对类文件进行操作时,它就像:

0000000 feca beba 0000 3100 6300 0009 0019 0946 0000020 1900 4700 0009 0019 0948 1900 4900 0009 0000040 0019 094a 1900 4b00 000a 001a 074c 4d00

第一行约为2 * 8字节,为什么第二行地址为0000020?

3 个答案:

答案 0 :(得分:4)

  

但是我们能否知道给定java类文件的64位或32位信息?

不,你不能说。

  • Java字节码是字大小的“不可知”。可以在32位或64位JVM上加载和运行相同的.class文件。它们在 1 上编译的平台无关紧要。
  • javap输出中没有任何内容告诉您使用了什么java编译器。 (您可以从类文件版本中直接使用Java主要版本,但这不是确定的,并且它不是我们所说的......)
  • JVM specification没有定义任何标准“属性”来编码java编译器版本,或者它是否在32位或64位JVM上运行。
  • 我使用UNIX / Linux实用程序(例如.classstrings)在od文件中找不到任何编译器版本字符串的跟踪。

跟进:

  

为什么第二行地址是0000020?

它是八进制的。有关详细信息,请参阅man 1 od。 (从历史上看,od是“八进制转储”的缩写。)

1 - 忽略类文件版本问题......

答案 1 :(得分:2)

Java .class文件与平台无关。特别是可以在32位和64位架构上执行相同的类文件。因此,类文件中没有这样的字段,因为它没有必要。

答案 2 :(得分:0)

类文件的字节代码是特殊的VM字节代码,与底层架构无关。因此,您无需确定此信息。您可以使用64位JDK编译Java程序并在JRE_32位上运行它。