1. 程式人生 > >有哪些類載入器?解釋什麼是雙親委派模型,為什麼使用雙親委派模型,如何自定義類載入器?什麼時候應該自定義類載入器?

有哪些類載入器?解釋什麼是雙親委派模型,為什麼使用雙親委派模型,如何自定義類載入器?什麼時候應該自定義類載入器?

類載入器:啟動類載入器(bootstrap classLoader),擴充套件類載入器(extension),應用類載入器(Application),自定義類載入器(user ClassLoader);

雙親委派模型:如果一個類載入器收到了載入某個類的請求,則該類載入器並不會去載入該類,而是把這個請求委派給父類載入器,每一個層次的類載入器都是如此,因此所有的類載入請求最終都會傳送到頂端的啟動類載入器;只有當父類載入器在其搜尋範圍內無法找到所需的類,並將該結果反饋給子類載入器,子類載入器會嘗試去自己載入.

使用雙親委派模型原因:java類隨著其類載入器一起具備了一種帶有優先順序的層次關係.例如

java.lang.Object,無論哪一個類載入器要載入該類,最終都是委託給處於頂端的啟動類載入器,因此object在程式的各種類載入器環境中都是同一個類.相反如果沒有使用雙親委派模型,那麼假如使用者自定義了一個稱為java.lang.Object的類,並放在classPath,那麼系統將會出現多個不同的Object,java型別體系中最基礎的行為都無法保證.

為什麼需要自定義類載入器:

1)加密:java程式碼可以輕易的被反編譯,如果你需要對你的程式碼進行加密以防止反編譯,可以先將編譯後的程式碼用加密演算法加密,類加密後就不能再使用java自帶的類載入器了,這時候就需要自定義類載入器

.

2)從非標準的來源載入程式碼:位元組碼是放在資料庫,甚至是雲端,就可以自定義類載入器,從指定來源載入類.

自定義類載入器的方法:

1、如果不想打破雙親委派模型,那麼只需要重寫findClass方法即可

2、如果想打破雙親委派模型,那麼就重寫整個loadClass方法

    private File getClassFile(String name)

    {

        File file = new File("D:/Person.class");//此處要提前編譯Person,並把class檔案放到d盤下.

        return file;

    }