引言
Java中有三種基礎的類加載器 BootStrap, Extension and System
他們都有一個職能,就是從不同的包中加載類。
但是一個類加載器完全可以加載所有的類闽烙,為什么要有3種基礎的類型的類加載器呢?
最佳答案
Java中有三種基礎的類加載器主要為了安全声搁。
1.2版本的JVM中黑竞,只有一個類加載器,就是現(xiàn)在的“Bootstrap”類加載器疏旨。
類加載器加載類的方式是很魂,加載器先調用父加載器對類進行加載,如果父加載器找不到該類充石,此加載器才會去加載該類莫换。
最關鍵的是, 除非是同一個類加載器加載的類 骤铃,否則JVM不會保證包訪問級別(如果不指明private/public或protected拉岁,則方法和屬性具有包訪問級別)。
因此惰爬,假如用戶調用他編寫的java.lang.MyClass類喊暖。理論上該類可以訪問和改變java.lang包下其他類的默認訪問修飾符的屬性和方法的能力。Java語言本身并沒有阻止這種行為撕瞧。但是JVM則會阻止這種行為陵叽,因為java核心類庫的java.lang包下的類是由bootstrap類加載器加載的狞尔。不是同一個類加載器加載的類等于不具有包級別的訪問權限。
類加載器中的其他安全特性也會阻止這種類型侵入巩掺。
所以為什么有三種基礎的類加載器偏序?是因為他們代表三種不同的信任級別。最可信的級別是java核心API類胖替。然后是安裝的拓展類研儒,最后才是在類路徑中的類(屬于你本機的類)。
其他解釋1
類加載主要的應用場景是在應用服務器上独令。
如果你想啟動Tomcat端朵。這至少需要一個類加載器來運行Tomcat自己。
然后你想在Tomcat容器中部署項目燃箭。因此Tomcat需要加載和分析甚至在Tomcat啟動前都不存在的類冲呢。
然后你又想在Tomcat中部署另外一個應用。 第二個應用可能也會用到第一個應用使用的庫招狸,但是版本不同敬拓。
因此你就需要每個應都有相互隔離的類加載器,否則第二個應用的類可能會覆蓋第一個應用之前加載的類瓢颅,從而造成一些意想不到的后果恩尾。
然后你想停掉某個web應用。該應用的類加載器應該會被銷毀挽懦,垃圾也隨之被回收,這樣可以避免內存泄露木人。
或許類加載器還有其他用途信柿,但這是我印象中最常見的用法。
其他解釋2
多種類加載器待辦可以同時加載多個應用程序(一個加載服務醒第,另外的加載器用來服務器內部的部署)渔嚷。
每種加載器都有對應的層級來加載某些特定的類,來保證他們之間的安全性稠曼。
總結
當你工作一段時間以后形病,差不多3 年左右的時間,你就需要花點時間思考下霞幅,給自己一個未來的規(guī)劃漠吻,想想自己對什么是真正的感興趣,什么方向才真正的適合自己司恳,進而給自己定位途乃,然后朝著自己定位的方向去學習,去努力扔傅,只有這樣才能讓你在職業(yè)生涯的中期不至于迷茫耍共,不至于覺得心里沒底