為了創建一個有效的 .class 檔案,每個方法都必須有一個完整的內部名稱和與之關聯的型別描述符。在程式上創建這些時,是否可以使用某種查找表(在 Java 之外,可以使用 ClassLoader)從方法名稱中獲取這些型別描述符?例如,如何從Scanner.hasNextByteto boolean java.util.Scanner.hasNextByte(int) / boolean java.util.Scanner.hasNextByte()(甚至從to )?上面的示例中存在多載,這是人類但主要是計算機可讀的宣告檔案希望解決的另一個問題。java.util.Scanner.hasNextByteboolean java.util.Scanner.hasNextByte(int) / boolean java.util.Scanner.hasNextByte()
我發現了許多人類可讀檔案的來源,例如https://docs.oracle.com/javase/8/docs/api/index.html包含每種方法的使用、到其他地方的超鏈接等,但從來都不是簡單的僅包含任何格式的宣告的文本檔案或檔案集合。如果沒有這樣的檔案不用擔心,我可以嘗試抓取一些煩人的 HTML 檔案,但如果有的話會節省很多時間。謝謝!
uj5u.com熱心網友回復:
最簡潔的答案是不。
沒有包含 Java 類別庫的類和方法簽名的“頭檔案”。Java 工具鏈不需要這種東西。第三方 Java 編譯器或依賴于 Java SE 類別庫的其他語言的編譯器也沒有。
AFAIK,沒有構建此類檔案或等效資料庫或記憶體資料結構的第 3 方工具。
你可以創建一個。
您可以選擇現有的 Java 決議庫,并使用它為類別庫中的所有源檔案構建決議樹,并發出您需要的資訊。
您可能會創建一個自定義 Javadoc“doclet”插件來發出資訊。
話雖如此,我不明白你為什么需要這樣的映射。當然,您的 IDE 已經這樣做了……并通過一些內部 API 公開資訊。如果這不是一個 IDE 插件,它是干什么用的?
你評論說:
我正在為基于 JVM 的編程語言制作編譯器....
啊......所以你的編譯器應該做其他編譯器做的事情。從“.class”檔案中獲取資訊。您可以使用標準或自定義類加載器加載類,也可以使用類似asmorbcel或javassist... 的庫,它可以在不加載 .class 檔案的情況下讀取它。
(我沒有檢查過,但我認為標準javac編譯器使用內部 API 來執行此操作。)
請注意,您提出的方法不適用于與源代碼不可用和/或 javadoc 不可抓取的第 3 方 Java 庫的介面。
uj5u.com熱心網友回復:
從標準庫的源檔案構建它怎么樣?
您參考的 Oracle Java 8 API 網頁是通過 Javadoc 處理 Java 標準庫的源檔案創建的。
如果您使用帶有除錯器的 IDE,那么您很有可能已經下載了許多標準庫源代碼。畢竟,如果你設定一個斷點,然后用“Step into”一步步跟隨程式,你可以將程式的執行跟蹤到標準庫方法中。源檔案將是 JDK 的一部分。
但是,由于許可限制,標準庫源的某些部分可能不可用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/462507.html
上一篇:TypeError:'bool'物件不可呼叫python
下一篇:SQL日期過濾器|模型性能
