从java类文件中的十六进制值解释访问标志

时间:2015-06-22 10:48:26

标签: java class parsing hex

这是java类文件的十六进制转储,已排除了幻数,minor_version,major_version和常量池。

Hex dump

我想找到该类的访问标志。如果我理解正确,访问标志将是此十六进制转储中的第一个值,因为前面的值已被排除。

这给了我作为访问标志的值04和21。我的问题是这些与访问标志值不对应(没有21)。如何解释这些值以访问下表中的标志?

ACC_PUBLIC  0x0001  Declared public; may be accessed from outside its package.
ACC_FINAL   0x0010  Declared final; no subclasses allowed.
ACC_SUPER   0x0020  Treat superclass methods specially when invoked by the invokespecial instruction.
ACC_INTERFACE   0x0200  Is an interface, not a class.
ACC_ABSTRACT    0x0400  Declared abstract; must not be instantiated.
ACC_SYNTHETIC   0x1000  Declared synthetic; not present in the source code.
ACC_ANNOTATION  0x2000  Declared as an annotation type.
ACC_ENUM    0x4000  Declared as an enum type.

2 个答案:

答案 0 :(得分:3)

您似乎对访问标志为bitmask这一事实感到困惑。也就是说,相关的标志被“或”在一起以获得位掩码。在0x0421的情况下,它是ACC_ABSTRACT | ACC_SUPER | ACC_PUBLIC == 0x0400 | 0x0020 | 0x0001 == 0x0421

你可以测试一个标志,例如ACC_ABSTRACT,通过AND与标志位的常量设置。如果它不为零,则设置标志。例如,myFlags & ACC_ABSTRACT != 0

您也可以使用Apache Common的ClassParser。它已经为你实现了类文件解析。

答案 1 :(得分:1)

这是因为特定属性值(TrueFalse)的所有 Class access and property modifiers 都会参加 or operation 建立整个国旗。假设一个类是:

  • 公开0x0001
  • 摘要0x0400

最后的标志将是

 0x0001|0x0400=0x0401
 # expand them to do the or operation:
                   Public
                   |
                   v
 0000 0000 0000 0001  <-- this is 0x0001
 OR
 0000 0100 0000 0000  <-- this is 0x0400
       ^
       |
      Abstract
 =
 0000 0100 0000 0001 <-- flag is 0x0401

因此,根据您班级的旗帜(0x0421),该属性应为:

  • 摘要0x0400
  • ACC_SUPER 0x0020
  • 公开0x0001

这将构建0x0421的标志。