當我查看Java源碼時,我發現一些特別的文件,主要涉及的有java.nio
包下的ByteBuffer
等類似的類,有舍非常凌亂的源碼,還寫着This file was mechanically generated: Do not edit!
,這些文件通過機器生成的,不要編輯!
這些文件包含了大量空行(有些升值在javadocs中),大概是爲了防止行號更改,我也看過一些java反編譯器,類似procyon-decompiler
,它有一個選項來保持行號,但我懷疑是這種情況,因爲在最終accolade前添加空白行不會改變什麼。
下面是其中一些文件(我在網上找不到它們的鏈接,也沒有粘貼,因爲我不想破壞任何版權,但你能在JDK安裝文件夾根目錄下的src.zip
中找到它們)
- java.nio.ByteBuffer
- java.nio.DirectByteBufferR
- java.nio.Bits
- java.nio.BufferOverflowException
我很想知道
- 什麼工具生成的這些文件?
- 爲什麼工具要保持行號不變,爲了更容易debugger嗎?
- 爲什麼要使用工具生成它們,而其他所有類都是由人編寫的?
- 略
我可能不能回答所有的問題,但一些背景是:
在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] $@
$(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] $@
...
$(X_BUF_TEMPLATE)
指的事 X-Buffer.java.template
, 它是諸如Charbuffer
、Shortbuffer
等類型緩衝區的源代碼。
注意:URL將來可能會改變。也很抱歉引用了Java7。在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.
爲什麼要使用工具生成它們,而其他所有類都是由人類編寫的?
對於這種特殊情況,我沒有權威的答案,但通常你使用代碼生成工具可能由以下情況
- 如果你需要創建許多相似的類/方法,這些類/方法只在某些細節上有所不同,但非常微妙,因此您不能使用已建立的機制,如泛型或方法參數(可能是這裏的情況,因爲緩衝區是爲不能與泛型一起使用的基本類型生成的)
- 如果需要從更簡單的表示創建複雜的算法(比如從語法生成解析器)。
爲什麼工具要保持行號不變,爲了更容易debugger嗎?
我的猜測:是。它將行號保留在堆棧跟蹤中,以便它們與模板文件匹配。其他工具比如C
預處理器工作原理類似。