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

hon*_*rst 0 java

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

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

如果字节码与字大小无关,那么当您读取类文件时,它就像:

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?

Ste*_*n C 5

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

不,你不能告诉。

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

跟进:

为什么第二行地址是0000020?

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


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