亚洲综合极品香蕉久久网,久久夜精品综合缴情五月 ,亚洲动漫成人一区二区,国产在线不卡视频,国产丝袜精品不卡,亚洲乱码日产精品bd,久久久久久国产精品免费网站,亚洲综合av一区二区三区
×
新網 > 虛擬主機 > 正文

java 虛擬機10:類加載器

  • 作者:新網
  • 來源:新網
  • 瀏覽:100
  • 2018-04-23 14:33:28

虛擬機設計團隊把類加載階段張的”通過一個類的全限定名來獲取此類的二進制字節流”這個動作放到Java虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。

   

  1a9e54a8-08e6-4532-9197-5b2e9bbd47ce.jpg

       虛擬機設計團隊把類加載階段張的”通過一個類的全限定名來獲取此類的二進制字節流”這個動作放到Java虛擬機外部去實現,以便讓應用程序自己決定如何去獲取所需要的類。
       實現這個動作的代碼模塊稱為”類加載器”。類加載器雖然只用于實現類的加載動作,但它在Java程序中起到的作用卻遠遠不限定于類加載階段。對于任意一個類,都需要由加載它的類加載器和這個類本身一同確立其在Java虛擬機中的唯一性,每一個類加載器,都擁有一個獨立的類名稱空間。這句話表達地再簡單一點就是:比較兩個類是否”相等”,只有在這兩個類是由同一個類加載器加載的前提下才有意義,否則即使這兩個類來源于同一個.class文件,被同一個虛擬機加載,只要加載它們的類加載器不同,這兩個類必定不相等。
  上面說的”相等”,包括代表類的.class對象的equals()方法、isAssignableFrom()方法、isInstance()方法的返回結果,也包括使用instanceof關鍵字做對象所屬關系判定等情況。
  類加載器模型
  從Java虛擬機的角度講,只有兩種不同的類加載器:啟動類加載器Bootstrap ClassLoader,這個類加載器是由C++語言實現的,是虛擬機自身的一部分;其他類加載器,這些類加載器都由Java語言實現,獨立于虛擬機外部,并且全部繼承自java.lang.ClassLoader。從開發人員的角度講,類加載器還可以劃分地更加細致一些,一張圖就能說明:
  關于這張圖首先說兩點:
  1、這三個層次的類加載器并不是繼承關系,而只是層次上的定義
  2、它并不是一個強制性的約束模型,而是Java設計者推薦給開發者的一種類加載器實現方式
  OK,然后一個一個類加載器來看:
  1、啟動類加載器Bootstrap ClassLoader
  之前說過了這是一個嵌在JVM內核中的加載器。它負責加載的是JAVA_HOME/lib下的類庫,系統類加載器無法被Java程序直接應用
  2、擴展類加載器Extension ClassLoader
  這個類加載器由sun.misc.Launcher$ExtClassLoader實現,它負責用于加載JAVA_HOME/lib/ext目錄中的,或者被java.ext.dirs系統變量指定所指定的路徑中所有類庫,開發者可以直接使用擴展類加載器。java.ext.dirs系統變量所指定的路徑的可以通過程序來查看
  public class TestMain { public static void main(String[] args) { System.out.println(System.getProperty("java.ext.dirs")); } }
  運行結果
  E:\\MyEclipse10\\Common\\binary\\com.sun.java.jdk.win32.x86_64_1.6.0.013\\jre\\lib\\ext;C:\\Windows\\Sun\\Java\\lib\\ext
  3、應用程序類加載器Application ClassLoader
  這個類加載器由sun.misc.Launcher$AppClassLoader實現。這個類也一般被稱為系統類加載器,寫個小程序看下:
  public class TestMain { public static void main(String[] args) { System.out.println(ClassLoader.getSystemClassLoader()); } }
  運行結果為:
  sun.misc.Launcher$AppClassLoader@546b97fd
  看到通過”ClassLoader.getSystemClassLoader”,得到的是sun.misc.Launcher$AppClassLoader,這也證明了JDK認為Application ClassLoader是系統類加載器。順便根據類加載器模型,打印一下這個類的父加載器:
  public class TestMain { public static void main(String[] args) { System.out.println(ClassLoader.getSystemClassLoader().getParent()); } }
  運行結果為:
  sun.misc.Launcher$ExtClassLoader@535ff48b
  看出Application ClassLoader的父加載器確實是Extension ClassLoader,符合圖中的模型。那么再打印父加載器呢?按照我們的想法應該是Bootstrap ClassLoader了,看下是不是:
  public class TestMain { public static void main(String[] args) { System.out.println(ClassLoader.getSystemClassLoader().getParent().getParent()); } }
  運行結果為:
  null
  這會打印出來的是null了。其實也很好理解,Bootstrap ClassLoader以外的ClassLoader都是Java實現的,因此這些ClassLoader勢必在Java堆中有一份實例在,所以Extension ClassLoader和Application ClassLoader都能打印出內容來。但是Bootstrap ClassLoader是JVM的一部分,是用C/C++寫的,不屬于Java,自然在Java堆中也沒有自己的空間,所以就返回null了。所以,如果ClassLoader得到的是null,那么表示的ClassLoader就是Bootstrap ClassLoader。
  另外要說很重要的一點,反編譯一下rt.jar,找到sun.misc.Launcher看一下Application ClassLoader的實現:
  static class AppClassLoader extends URLClassLoader { public static ClassLoader getAppClassLoader(final ClassLoader paramClassLoader) throws IOException { String str = System.getProperty("java.class.path"); final File[] arrayOfFile = str == null ? new File[0] : Launcher.getClassPath(str); return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction() { public Launcher.AppClassLoader run() { URL[] arrayOfURL = this.val$s == null ? new URL[0] : Launcher.pathToURLs(arrayOfFile); return new Launcher.AppClassLoader(arrayOfURL, paramClassLoader); } }); }
  重點就在第6行,Application ClassLoader只會加載java.class.path下的.class文件,java.class.path代表的是什么路徑?打印一下:
  public class TestMain { public static void main(String[] args) { System.out.println(System.getProperty("java.class.path")); } }
  運行結果為:
  F:\\代碼\\MyEclipse\\TestArticle\\bin;F:\\學習\\第三方jar包\\XStream\\xstream-1.4.jar;F:\\學習\\第三方jar包\\XStream\\kxml2.jar
  Application ClassLoader只能加載項目bin目錄下的.class文件。雙親委派模型
  最后講一下雙親委派模型,其實上面的類加載器模型圖就是一個雙親委派模式的圖,這里把它再講清楚一點。
  雙親委派模型是在JDK1.2期間被引入的,其工作過程可以分為兩步:
  1、如果一個類加載器收到了類加載的請求,它首先不會自己去嘗試加載這個類,而是把這個請求委派給父類加載器去完成,每一個層次的類加載器都是如此。2、只有當父加載器反饋自己無法完成這這個加載請求(它的搜索范圍中沒有找到所需的類)時,子加載器才會嘗試自己去加載
  所以,其實所有的加載請求最終都應該傳送到頂層的啟動類加載器中。雙親委派模型對于Java程序的穩定運作很重要,因為Java類隨著它的加載器一起具備了一種帶有優先級的層次關系。例如java.lang.Object,存放于rt.jar中,無論哪一個類加載器要去加載這個類,最終都是由Bootstrap ClassLoader去加載,因此Object類在程序的各種類加載器環境中都是一個類。相反,如果沒有雙親委派模型,由各個類自己去加載的話,如果用戶自己編寫了一個java.lang.Object,并放在CLASSPATH下,那系統中將會出現多個不同的Object類,Java體系中最基礎的行為也將無法保證,應用程序也將會變得一片混亂。
 

 

免責聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,也不承認相關法律責任。如果您發現本社區中有涉嫌抄襲的內容,請發送郵件至:operations@xinnet.com進行舉報,并提供相關證據,一經查實,本站將立刻刪除涉嫌侵權內容。

免費咨詢獲取折扣

Loading
主站蜘蛛池模板: av夜夜躁狠狠躁日日躁| 亚洲一区二区三区自拍天堂| 99国产精品无码专区| 日本污ww视频网站| 最新精品露脸国产在线| 中字幕久久久人妻熟女| 亚洲婷婷五月激情综合app| 偷窥国产亚洲免费视频| 伊人久久综合狼伊人久久| 香蕉免费一区二区三区| 在线精品自偷自拍无码| 亚洲中文字幕久久久一区| 182tv午夜福利在线地址二| 中日韩亚洲人成无码网站| 天天狠天天天天透在线| 精品九九人人做人人爱| 天堂亚洲2017在线观看| 国产精品欧美久久久久无广告| 欧美日韓性视頻在線| 少妇激情艳情综合小视频 | 亚洲精品无码专区在线播放| 午夜福利理论片高清在线| 亚洲国产成人精品福利| 99久视频只有精品2019| 日本熟妇人妻xxxxx-欢迎您| 人妻丰满av无码中文字幕| 人妻少妇精品视频无码综合| 国产成人精品亚洲午夜| 无码h黄肉动漫在线观看999| 人妻丰满熟妇ⅴ无码区a片| 一区二区高清国产在线视频| 日韩免费无砖专区2020狼| 视频一区二区无码制服师生| 亚洲日本高清成人aⅴ片| 国产精品另类激情久久久免费| 精品国产情侣高潮露脸在线| 日本国产一区二区三区在线观看 | 新婚人妻不戴套国产精品| 成 人色 网 站 欧美大片在线观看| 99热这里只就有精品22| 国产色a∨在线看免费|