Java源代码中的"机械生成"java源文件

Run*_*oro 10 java openjdk bytebuffer

当我查看Java源代码时,我发现了一些不寻常的文件,这些文件大多与包中的ByteBuffers 有关,这些文件java.nio包含非常混乱的源代码并被标记This file was mechanically generated: Do not edit!.

这些文件还包含大部分空白行(有些甚至在javadocs中间(!!?)),可能是为了防止行号发生变化.我也看过一些java反编译器,例如procyon-decompiler,它们可以选择保留行号,但我怀疑是这种情况,因为在最终的奖励之前放空行不会改变.

以下是一些这些文件(我在网上找不到任何链接,并没有粘贴它们,因为我不想破坏任何版权,但你可以在src.zipJDK安装根目录下的文件夹中找到它们夹):

  • java.nio.ByteBuffer中
  • java.nio.DirectByteBufferR
  • java.nio.Bits
  • java.nio.BufferOverflowException

我很想知道:

  • 哪个工具生成了这些文件?
  • 为什么该工具保持行号相同?它是否使调试(堆栈跟踪)更容易?
  • 为什么会使用工具来生成它们,而所有其他类都是由人类编程的?
  • 为什么该工具会在括号内,最终荣誉之前,甚至在javadocs中随机放置空行?

And*_*ter 9

我可能无法回答所有问题,但有些背景是:

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预处理器的工作方式类似.