天天看點

Java類加載器加載類順序

java classloader的學習

java是一門解釋執行的語言,由開發人員編寫好的java源檔案先編譯成位元組碼檔案.class形式,然後由java虛拟機(jvm)解釋執行,.class位元組碼檔案本身是平台無關的,但是jvm卻不是,為了實作所謂的一次編譯,到處執行,sun提供了各個平台的jvm實作--也就是說jvm不是跨平台的,編譯好的位元組碼檔案被放在不同的作業系統平台上的jvm所解釋執行,這個章節主要解釋一下jvm裝載類的機制

1.classloader是個毛東東?

    一個類如果要被jvm所排程執行,必須先把這個類加載到jvm記憶體裡,java.lang下有個很重要的類classloader,這個類主要就是用來把指定名稱(指定路徑下)的類加載到jvm中

2.classloader的分類

   主要分4類,見下圖橙色部分

   jvm類加載器:這個模式會加載java_home/lib下的jar包

   擴充類加載器:會加載java_home/lib/ext下的jar包

   系統類加載器:這個會去加載指定了classpath參數指定的jar檔案

   使用者自定義類加載器:sun提供的classloader是可以被繼承的,允許使用者自己實作類加載器

   類加載器的加載順序如圖所示:

Java類加載器加載類順序

3.類加載順序

  jvm并不是把所有的類一次性全部加載到jvm中的,也不是每次用到一個類的時候都去查找,對于jvm級别的類加載器在啟動時就會把預設的java_home/lib裡的class檔案加載到jvm中,因為這些是系統常用的類,對于其他的第三方類,則采用用到時就去找,找到了就緩存起來的,下次再用到這個類的時候就可以直接用緩存起來的類對象了,classloader之間也是有父子關系的,沒個classloader都有一個父classloader,在加載類時classloader與其父classloader的查找順序如下圖所示

Java類加載器加載類順序