openjdk在java源代码中“机械生成”java源文件
当我浏览Java源代码时,我发现了一些不寻常的文件,主要与java.nio
包中的ByteBuffer
有关,该包的源代码非常混乱,并且被标记为This file was mechanically generated: Do not edit!
以下是其中的一些文件(我在网上找不到任何指向它们的链接,也没有粘贴它们,因为我不想破坏任何版权,但你可以在JDK安装文件夹根目录下的src.zip
文件夹中找到它们):
- 爪哇。尼奥。ByteBuffer
- 爪哇。尼奥。DirectByteBufferR
- 爪哇。尼奥。点点滴滴
- 爪哇。尼奥。BufferOverflowException
我很想知道:
- 哪个工具生成了这些文件李>
- 为什么工具会保持行号不变?是为了让调试(stacktraces)更容易吗李>
- 为什么要使用工具生成它们,而所有其他类都是由人类编程的李>
- 为什么该工具会在最终获奖之前,甚至在javadocs中,随机地将空行放在括号内李>
# 1 楼答案
我可能无法回答所有问题,但一些背景是:
在位于http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/Makefile的Makefile中,他们通过一些预处理器从同一模板文件生成不同的java源文件:
$(X_BUF_TEMPLATE)
指的是X-Buffer.java.template
,它是CharBuffer
、ShortBuffer
等类型缓冲区的源注意:URL将来可能会更改。也很抱歉提到Java 7——在Java 8中,他们修改了构建系统,到目前为止,我还没有找到相应的makefile
GEN_BUFFER_SH
/GEN_BUFFER_CMD
最后指的是genBuffer.sh
,所以创建这些文件的脚本是http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh对于这个特定的案例,我没有权威的答案,但通常您使用的是代码生成工具
我猜:是的,它需要在堆栈跟踪中保留行号,以便它们与模板文件匹配。其他的工具,比如
C
预处理器,工作原理类似