URL 原始碼分析

2021-10-09 08:56:02 字數 4341 閱讀 7644

url表示統一資源定位器,指向世界上「資源」的指標全球資訊網。資源可以是簡單的檔案或目錄,或者它可以是對更複雜物件的引用,例如對資料庫或搜尋引擎的查詢。這個類的作用就是url的定位的作用,定位了每個資源符號引用的位置。整個url大體上就是對url內容進行規範,對url進行解析。

構造方法是通過檔案裡面的埠和檔案的訪問主機對這個url進行構造。

public

url(string protocol, string host,

int port, string file)

throws malformedurlexception

url的構造方法,這個構造方法裡面傳輸了url裡面的協議,主機名,埠號和檔名,最後通過流協議處理器來進行url的解析。

public

url(string protocol, string host,

int port, string file,

urlstreamhandler handler)

throws malformedurlexception

}

protocol = protocol.

tolowercase()

;this

.protocol = protocol;

//判斷主機名是否為空

if(host != null)

this

.host = host;

//埠號小於-1,丟擲異常說明這個埠號是無效埠。

if(port <-1

)this

.port = port;

//判斷主機名中是否有埠號

authority =

(port ==-1

)? host : host +

":"+ port;

}//parts類對檔案的資訊進行處理。

parts parts =

newparts

(file)

; path = parts.

getpath()

; query = parts.

getquery()

;if(query != null)

else

ref = parts.

getref()

;if(handler == null &&

(handler =

geturlstreamhandler

(protocol)

)== null)

this

.handler = handler;

//呼叫url流處理器來進行url的解析。

if(host != null &&

isbuiltinstreamhandler

(handler))}

//判斷是否是jar的連線協議if(

"jar"

.equalsignorecase

(protocol))}

}}

url反序列化狀態值

public

urldeserializedstate

(string protocol,

string host,

int port,

string authority, string file,

string ref,

int hashcode)

檔案資訊分離,分離「#」符號以後的引用內容,分離"?"以後的引數。見文末「#」引用在url位址中的作用。

class

parts

else

} string getpath()

string getquery()

string getref()

}

url讀取內容處理方法。設定urlstreamhandler 目的是為了進行開啟連線和進行url的字串的解析。

private object readresolve()

throws objectstreamexception

else

return replacementurl;

}//設定url反序列化引數。

private url setdeserializedfields

(urlstreamhandler handler)

}else

if(authority != null)

//構造路徑和查詢部分

string path = null;

string query = null;

if(file != null)

else

path = file;

}//設定物件字段。

this

.protocol = protocol;

this

.host = host;

this

.port = port;

this

.file = file;

this

.authority = authority;

this

.ref = ref;

this

.hashcode = hashcode;

this

.handler = handler;

this

.query = query;

this

.path = path;

this

.userinfo = userinfo;

replacementurl =

this

;return replacementurl;

}

static

final string builtin_handlers_prefix =

"sun.net.www.protocol"

;boolean

isbuiltinstreamhandler

(urlstreamhandler handler)

private

boolean

isbuiltinstreamhandler

(string handlerclassname)

//臨時引數存放

private

transient urldeserializedstate tempstate;

private url fabricatenewurl()

throws invalidobjectexception

catch

(malformedurlexception mex)

replacementurl.

setserializedhashcode

(tempstate.

gethashcode()

);resetstate()

;return replacementurl;

}

final

class

urldeserializedstate

//預計算stringbuilder的長度

int len = protocol.

length()

+1;if

(authority != null && authority.

length()

>0)

len +=

2+ authority.

length()

;if(file != null)

if(ref != null)

len +=

1+ ref.

length()

; stringbuilder result =

newstringbuilder

(len)

; result.

(protocol)

; result.

(":");

if(authority != null && authority.

length()

>0)

if(file != null)

if(ref != null)

return result.

tostring()

;}}

附:url類的使用方法

url中#的作用

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...