有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

openjdk在java源代码中“机械生成”java源文件

当我浏览Java源代码时,我发现了一些不寻常的文件,主要与java.nio包中的ByteBuffer有关,该包的源代码非常混乱,并且被标记为This file was mechanically generated: Do not edit!

<>这些文件也包含了大量的空白行(有些甚至在JavaDoc(!!)的中间),大概是为了防止行号改变。我也见过一些java反编译器,比如^{},它们可以选择保留行号,但我怀疑这是真的,因为在最后的赞扬之前放空行不会改变任何东西

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

  • 爪哇。尼奥。ByteBuffer
  • 爪哇。尼奥。DirectByteBufferR
  • 爪哇。尼奥。点点滴滴
  • 爪哇。尼奥。BufferOverflowException

我很想知道:

  • 哪个工具生成了这些文件
  • 为什么工具会保持行号不变?是为了让调试(stacktraces)更容易吗
  • 为什么要使用工具生成它们,而所有其他类都是由人类编程的
  • 为什么该工具会在最终获奖之前,甚至在javadocs中,随机地将空行放在括号内

共 (1) 个答案

  1. # 1 楼答案

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

    在位于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等类型缓冲区的源

    注意:URL将来可能会更改。也很抱歉提到Java 7——在Java 8中,他们修改了构建系统,到目前为止,我还没有找到相应的makefile

    Which tool generated these files?

    GEN_BUFFER_SH/GEN_BUFFER_CMD最后指的是genBuffer.sh,所以创建这些文件的脚本是http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh

    Why would a tool be used to generate them, while all other classes are programmed by humans?

    对于这个特定的案例,我没有权威的答案,但通常您使用的是代码生成工具

    • 如果您需要创建许多类似的类/方法,这些类/方法只是在某些细节上有所不同,但非常微妙,以至于无法使用泛型或方法参数等已建立的机制(这里可能是这种情况,因为缓冲区是为不能与泛型一起使用的基元类型生成的)
    • 如果您需要从一个简单得多的表示中创建复杂的算法(比如从语法生成解析器)

    Why does the tool keep the line numbers the same? Is it to make debugging (stacktraces) easier?

    我猜:是的,它需要在堆栈跟踪中保留行号,以便它们与模板文件匹配。其他的工具,比如C预处理器,工作原理类似