数字.access$XXXX代表什么?

8
我在堆栈中有一个字符串,例如 "at alexei.ATable$IndexOfATable.access$1400(ATable.java:80)"。
我很好奇,数字 1400 是什么意思? 内部类 IndexOfATable 只有3个字段,不可能是 1400。
有趣的是,为什么数字 1400 这么大?
debug:
Exception in thread "main" java.lang.NullPointerException
    at alexei.ATable$IndexOfATable.compareTwoRows(ATable.java:181)
    at alexei.ATable$IndexOfATable.access$1400(ATable.java:80)
    at alexei.ATable.updateIndex(ATable.java:501)
    at alexei.ATable.addRow(ATable.java:361)
    at learn.Base.main(Base.java:18)
Java Result: 1

1
..$1400只是特定标识符的一部分 - 带有 $ 的标识符通常由编译器/工具(包括javac中的匿名类)生成。它不需要与索引或大小相关。请参见此答案以了解“通常”意味着什么:https://dev59.com/PFPTa4cB1Zd3GeqPhTu7#4636669。 - user2246674
我意识到它们按步骤100编号:access$000,access$100,access$200等等。 - Dumas45
1个回答

22
这是一种由编译器生成的合成方法,用于处理内部类。Java字节码没有内部类的概念,因此在编译时会执行各种技巧来“伪造”运行时存在的内部类。在这种特殊情况下,access$XXX 方法类通常与从内部类向外部类提供引用相关联。这些人工合成的实体就是这样的迹象。(您通常可以通过类/方法名称中的美元符号来识别它们。)
为什么数字1400这么大呢?
这只是编译器需要知道(并选择)的纯任意标识符。只要在应用程序中唯一即可,它可以是任何东西(从技术上讲,甚至不必是数字)。
至于问题出在哪里,请看最顶层堆栈跟踪所给出的行:ATable.java:181。

我正在尝试将两个类文件outer和inner反编译成一个单独的Java文件。它显示了一个错误,说该方法未定义。我该怎么办? - Ridhuvarshan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接