ClassLoader c //imagine this is a valid object
c.loadClass(String className, boolean resolveIt);
這是使我感到困惑的className參數。我已經將java文件寫入文件夾,並使用反射進行編譯。我不確定如何指向正確的文件以及我爲className使用什麼命名約定。類加載器如何找到類
該文檔說sayjust說的類的名稱,但它應該怎麼知道它在哪裏?
感謝
ClassLoader c //imagine this is a valid object
c.loadClass(String className, boolean resolveIt);
這是使我感到困惑的className參數。我已經將java文件寫入文件夾,並使用反射進行編譯。我不確定如何指向正確的文件以及我爲className使用什麼命名約定。類加載器如何找到類
該文檔說sayjust說的類的名稱,但它應該怎麼知道它在哪裏?
感謝
一個ClassLoader
的一點是準確地知道如何搜索給出一個類名的類文件。 Javadoc中說:
給定類的二進制名稱,一個類加載器應該嘗試 查找或生成構成類定義的數據。典型的策略是將名稱轉換爲文件名,然後從文件系統中讀取該名稱的「類文件」。
所以,你必須讓你的ClassLoader類的名稱翻譯成某個位置,其中的類的字節碼會被發現。 URLClassLoader
通過將類名轉換爲路徑並在URL指向的各種jar和目錄中查找該路徑來實現此目的。
這就是爲什麼你首先寫一個類加載器的原因:它只是一個將類名映射到內存中的(二進制)類的機制。類加載器獲取數據的地方是它自己的業務。
例如,URLClassLoader將查詢類路徑並查看它是否可以找到包含指定類的文件。
這就是類路徑的用途。順便說一下,它是該類的完全限定名稱,包括包層次結構。 – Viruzzo
@維魯佐 - 你說的一般情況下是不正確的。對於某些特定的類加載器可能是正確的。但是可能會有類加載器以不同的方式做它(例如,從數據庫中獲取類數據)。 – Ingo
@Ingo我指的是默認的類加載器;我認爲他對默認情況感興趣,而不是普通情況。 – Viruzzo