Run*_*oro 10 java openjdk bytebuffer
当我查看Java源代码时,我发现了一些不寻常的文件,这些文件大多与包中的ByteBuffers 有关,这些文件java.nio包含非常混乱的源代码并被标记This file was mechanically generated: Do not edit!.
这些文件还包含大部分空白行(有些甚至在javadocs中间(!!?)),可能是为了防止行号发生变化.我也看过一些java反编译器,例如procyon-decompiler,它们可以选择保留行号,但我怀疑是这种情况,因为在最终的奖励之前放空行不会改变.
以下是一些这些文件(我在网上找不到任何链接,并没有粘贴它们,因为我不想破坏任何版权,但你可以在src.zipJDK安装根目录下的文件夹中找到它们夹):
我很想知道:
我可能无法回答所有问题,但有些背景是:
在http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/Makefile的Makefile中,它们通过一些预处理器从同一模板文件生成不同的java源文件:
...
$(BUF_GEN)/CharBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH)
$(prep-target)
@$(RM) $@.temp
TYPE=char SRC=$< DST=$@.temp $(GEN_BUFFER_CMD)
$(MV) $@.temp $@
$(BUF_GEN)/ShortBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH)
$(prep-target)
@$(RM) $@.temp
TYPE=short SRC=$< DST=$@.temp $(GEN_BUFFER_CMD)
$(MV) $@.temp $@
...
Run Code Online (Sandbox Code Playgroud)
$(X_BUF_TEMPLATE)指的是X-Buffer.java.template,类似缓冲区的来源CharBuffer,ShortBuffer以及更多.
注意:以后URL可能会更改.也很遗憾提到Java 7 - 在Java 8中他们修改了构建系统,到目前为止我没有找到相应的Makefile.
哪个工具生成了这些文件?
GEN_BUFFER_SH/ GEN_BUFFER_CMDfinally指的是genBuffer.sh,创建这些文件的脚本是http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh.
为什么会使用工具来生成它们,而所有其他类都是由人类编程的?
对于这个特定情况,我没有权威的答案,但通常您使用的是代码生成工具
为什么该工具保持行号相同?它是否使调试(堆栈跟踪)更容易?
我猜:是的,它保留堆栈跟踪中的行号,以便它们匹配模板文件.其他工具如C预处理器的工作方式类似.