前言:
由於類的載入是採用委託模式,及先是父類載入器去載入載入失敗才是子類
要實現乙個類載入器不是複寫loadclass而是複寫findclass
原始碼主要邏輯就幾句:
注意:這個findclass呼叫的原始碼:
protected class<?> loadclass(string name, boolean resolve)
throws classnotfoundexception
else
} catch (classnotfoundexception e)
if (c == null)
}if (resolve)
return c;}}
1. 複寫findclass方法
2. 獲取這個.class檔案所對應的二進位製流
3. 再在這個findclass最後返回 return defineclass(null, data, 0, data.length);
public class myclassloader extends classloader
public myclassloader()
public myclassloader(classloader parent)
public void setkey(int key)
public void setpath(string path)
private byte loadclassdata(string name)
string filename = path + name.substring(name.lastindexof(".")+1) +filetype;
bytearrayoutputstream bos = new bytearrayoutputstream();//這個是將檔案中獲取的二進位制存放用的
try(
bufferedinputstream bis =new bufferedinputstream(new fileinputstream(filename));)}
可能碰到的問題:
1.總不能掉用你複寫的findclass方法 原因:你呼叫loadclass的路徑會被應用類載入器正確解析做法:如果你要載入的類在com.test.hello (最後的hello為類名)你可以寫成loadclass(com.hello) 不過你自己要在你的自定義的類載入器中給它拼去乙個完整的路徑。
我的上面的做法時我只要你傳人的類名 name.substring(name.lastindex(".")+1) (因為loadclass(name) 父類載入不了時它會傳人到findclass(name)) 餘下的我自定義類中有path
2. 為什麼我們載入成功後的類不能轉成原有的物件而只能轉成它的父類。
如果我們載入的類為hello 它沒有任何父類時它只能轉成object... 可能是我們defineclass中第乙個引數傳人null的原有
上面可能有不足如果有高手指點很樂意
自定義類載入器
注 class.forname name,initialize,loader 帶參函式也可控制是否載入static塊。並且只有呼叫了newinstance 方法採用呼叫建構函式,建立類的物件 如果乙個類載入器收到了類載入的請求,它首先不會自己去嘗試載入這個類,而是把請求委託給父載入器去完成,依次向上...
自定義類載入器
我們自己約定的需求如下,我們從外部路徑 tmp myclasspath 載入類 具體實現如下 public class myclassloader extends classloader catch ioexception e 測試 public static void main string ar...
JAVA類載入機制以及如何自定義類載入器
雙親委派機制描述 本文主要以tomcat7為例說明類載入機制,大家也可以參考tomcat7的類載入機制的官方文件。tomcat7總的classloader結構如下圖 各個類載入器載入類的範圍 載入順序預設如下 如果設定了,載入順序如下 jdk的解釋是這樣的 並不是給執行緒設定了contextclas...