2014-07-23 79 views
9

當我瀏覽Java源代碼時,發現了一些不尋常的文件,其中大部分與java.nio包中的ByteBuffer有關,該包中源代碼非常混亂,並被標記爲This file was mechanically generated: Do not edit!Java源代碼中的機械生成的java源文件

這些文件還包含很大一部分空白行(有些甚至在javadocs(!!?)中),這大概是爲了防止行號發生變化。我還看到了一些Java反編譯器,例如procyon-decompiler,它們可以選擇保留行號,但我懷疑是這種情況,因爲在最終的讚美之前放空行並沒有改變。

下面是這些文件中的一些(我在網上找不到任何鏈接,並沒有粘貼它們,因爲我不想打破任何版權,但是您可以在src.zip文件夾中找到它們你的JDK安裝文件夾根):

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

我很好奇地想知道:

  • 哪些工具生成這些文件?
  • 爲什麼該工具保持行號相同?它是否使調試(堆棧跟蹤)更容易?
  • 爲什麼要使用一個工具來生成它們,而所有其他類都是由人類編程的?
  • 爲什麼這個工具會在最後的榮譽之前,甚至在javadocs中,在括號內隨機地放置空行?
+0

我懷疑你會得到一個答案,因爲該代碼看起來已經很長時間了,請查看[2006年的這篇博客文章](http://www.iggdawg.com/blog/2006/09/jaaaavaaaaa /),當時Java仍然歸Sun所有。 – APC

+2

看起來這些文件是由模板文件中的某個預處理器生成的:http://hg.openjdk.java.net/jdk9/dev/jdk/file/3b298c230549/src/share/classes/java/nio/ ByteBufferAs-X-Buffer.java.template –

+0

IIRC,由於在#if或#else之後跳過,C預處理器會插入空行。在這裏,基本原理很清楚,我認爲:如果某個編譯器在輸出中標記了一個錯誤,您可以在原始輸入中找到它。 – laune

回答

9

我也許可以不回答所有的問題,但有些背景是:

在Makefile中在http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/Makefile,他們通過一些預處理產生來自同一模板文件不同的Java源文件

... 
$(BUF_GEN)/CharBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH) 
    $(prep-target) 
    @$(RM) [email protected] 
    TYPE=char SRC=$< [email protected] $(GEN_BUFFER_CMD) 
    $(MV) [email protected] [email protected] 
$(BUF_GEN)/ShortBuffer.java: $(X_BUF_TEMPLATE) $(GEN_BUFFER_SH) 
    $(prep-target) 
    @$(RM) [email protected] 
    TYPE=short SRC=$< [email protected] $(GEN_BUFFER_CMD) 
    $(MV) [email protected] [email protected] 
... 

$(X_BUF_TEMPLATE)指的是X-Buffer.java.template,它是CharBufferShortBuffer等一些類型緩衝區的來源。

注意:URL可能在將來發生變化。對於提到Java 7也很抱歉 - 在Java 8中,他們修改了構建系統,到目前爲止我沒有找到相應的Makefiles。

哪個工具生成這些文件?

GEN_BUFFER_SH/GEN_BUFFER_CMD終於是指genBuffer.sh,所以它創建這些文件的腳本是http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/9b8c96f96a0f/make/java/nio/genBuffer.sh

爲什麼會使用一個工具來生成它們,而所有其他類都是由人類編程的?

我沒有爲這個特定的情況下,權威的答案,但通常你正在使用的代碼生成工具

  • ,如果你需要創建很多相似的類/只在不同的方法一些細節,但它足夠微妙,以至於你不能使用已建立的機制,如泛型或方法參數(這裏可能是這種情況,因爲緩衝區是爲原始類型生成的,不能與泛型一起使用)
  • 如果需要從一個更簡單的表示(例如生成解析器)創建複雜的算法從語法來看)。

爲什麼工具保持行號一樣嗎?它是否使調試(堆棧跟蹤)更容易?

我猜測:是的,它保留堆棧跟蹤中的行號,以便它們匹配模板文件。其他工具,如C預處理器的工作類似。

+1

是的,這些類對於原始類型(short,char,...)是多樣化的。罕見的情況。有一些研究將原始類型包裝在未來的java中,因此您可以使用'Buffer '。 –