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

时间:2014-07-23 07:14:50

标签: java openjdk bytebuffer

当我查看Java源代码时,我发现了一些不寻常的文件,这些文件大多与ByteBuffer包中的java.nio相关,该文件包含非常混乱的源代码并标记为{{1} }。

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

以下是其中一些文件(我在网上找不到任何链接,也没有粘贴它们,因为我不想破坏任何版权,但您可以在This file was mechanically generated: Do not edit!中找到它们JDK安装文件夹根目录下的文件夹):

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

我很想知道:

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

1 个答案:

答案 0 :(得分: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 $@
...

$(X_BUF_TEMPLATE)是指X-Buffer.java.template,它是CharBufferShortBuffer等类型缓冲区的来源。

注意:以后网址可能会发生变化。也很遗憾提到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预处理器这样的其他工具也类似。