如果乙個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把請求委託給父載入器去完成,依次向上,因此,所有的類載入請求最終都應該被傳遞到頂層的啟動類載入器中,只有當父載入器在它的搜尋範圍中沒有找到所需的類時,即無法完成該載入,子載入器才會嘗試自己去載入該類。
classload原始碼:
protected class<?> loadclass(string name, boolean resolve) throws classnotfoundexception else
} catch (classnotfoundexception e) {}
//若父載入器和啟動類載入器都無法載入類,在自己嘗試載入
if (c == null)
}if (resolve)
return c;
}}
首先介紹幾個關鍵的方法了解了這幾個方法,我們知道重寫類載入器主要是重寫findclass方法,下面就是乙個自定義的類載入器的例子。
/**
* created by sjk on 2017/8/16.
* 通過.class檔案路徑動態載入類
*/public
class
myclassloader
extends
classloader else
}/**
* 讀取檔案流轉化為byte陣列
**@param path 路徑
*@return
*/private
byte loadclassdata(string path)
return bos.tobytearray();
} catch (exception e)
}private string getclassname(string name)
//去除.class檔案字尾
if (name.indexof(".") != -1)
//取檔名 例: ***/***/a --> a
if (name.lastindexof(file.separator) != -1)
return name;
}}
自定義類載入器
我們自己約定的需求如下,我們從外部路徑 tmp myclasspath 載入類 具體實現如下 public class myclassloader extends classloader catch ioexception e 測試 public static void main string ar...
JAVA類載入機制以及如何自定義類載入器
雙親委派機制描述 本文主要以tomcat7為例說明類載入機制,大家也可以參考tomcat7的類載入機制的官方文件。tomcat7總的classloader結構如下圖 各個類載入器載入類的範圍 載入順序預設如下 如果設定了,載入順序如下 jdk的解釋是這樣的 並不是給執行緒設定了contextclas...
實現java中自定義類載入器
前言 由於類的載入是採用委託模式,及先是父類載入器去載入載入失敗才是子類 要實現乙個類載入器不是複寫loadclass而是複寫findclass 原始碼主要邏輯就幾句 注意 這個findclass呼叫的原始碼 protected class loadclass string name,boolean...