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

标签 java class parsing hex

这是一个 java 类文件的十六进制转储,魔数(Magic Number)、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.

最佳答案

您似乎对访问标志是 bitmask 感到困惑。也就是说,将相关标志进行或运算以获得位掩码。对于0x0421,它是ACC_ABSTRACT | ACC_SUPER | ACC_PUBLIC==0x0400| 0x0020 | 0x0020 0x0001==0x0421

您可以测试是否有标志,例如ACC_ABSTRACT 通过将标志常量与位掩码进行“与”操作来设置。如果它非零,则设置标志。例如,myFlags & ACC_ABSTRACT != 0

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

关于java - 解释 Java 类文件中十六进制值的访问标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30978032/

相关文章:

java - 仅在尝试打开假定的缓存文件时 Hadoop 2 IOException

java - 在相关接口(interface)之间分配职责

java - 如何从 Android 中的 post 请求响应中获取特定的 json 键值?

javascript - JSON.parse 应该是递归的吗?

java - 基于安全策略创建java沙箱

java - 无法解析符号

java - 使用扫描仪读取文本文件时出现问题

c# - 从另一个类(在另一个线程上)写在文本框中

javascript - 在 JSON 数组中查找项目并将其添加到另一个数组中。 JavaScript

java - 程序仅以特定值进入无限循环