Java access$XXXX代表什么?

Java access$XXXX代表什么?,java,Java,我在堆栈中有一个字符串,比如“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.compareTwoRo

我在堆栈中有一个字符串,比如“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

它是编译器生成的一种合成方法,用于处理内部类。Java字节码没有内部类的概念,因此在编译时,它会执行各种技巧来“伪造”运行时是否存在内部类。在这种特殊情况下,
access$XXX
方法类通常与从内部类提供对外部类的引用相关联。这些合成实体就是这方面的标志。(您通常可以通过类/方法名称中的美元来识别它们。)

为什么数字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
它是一个纯粹的任意标识符,只有编译器需要知道(并因此选择)。只要它在应用程序中是唯一的,它就可以是任何东西(从技术上讲,它甚至不必是数字)


至于问题出在哪里,请看一下最顶层堆栈跟踪所给出的行:
ATable.java:181

。$1400
只是特定标识符的一部分-其中包含
$
的标识符通常由编译器/工具生成(包括javac中的匿名类)。它不需要与索引或大小相关。看看“正常”是什么意思。我意识到,它们按步骤100编号:access$000、access$100、access$200,所以我试图将外部和内部的两个类文件反编译成一个java文件。它显示一个错误,表示该方法未定义。我该怎么办?