1. 程式人生 > >2018-11-19學習日記

2018-11-19學習日記

類載入器

類載入器 Classloader 用來夾在java類到javaxuni虛擬機器中,一般來說,jaa虛擬機器使用java流淚的方式如下,:java源程式java檔案在經過java編譯器編譯後就被轉換為java位元組程式碼 class檔案.類載入器負責讀取Java位元組程式碼,並轉換為java.lang.Class類的一個例項,每個這樣的例項用來表示一個java類,通過這個例項的newINstance方法就可以創建出這個類的一個物件.

類載入器包括引導類載入器,擴充套件類載入器,系統類載入器

(bootstrap類載入器)引導類載入器主要用來載入java的核心庫,就是java_home/lib/rt.jar下的JDK類檔案,不繼承自classloader類,所以bootstrap類載入器也叫初始類載入器

(extension類載入器)拓展類載入器主要用來載入java的拓展庫,就是java_home/lib/ext的庫或者java.ext.dirs系統屬性定義的目錄下載入類

(application&system類載入器)系統類載入器是用來載入classpath環境變數,一般來說java的類都是由這個載入器來載入的

classpath定義的是類檔案的載入目錄,path是定義的執行程式,如javac,java等的執行路徑

 

載器的三個特點:

1.委託:類載入器會把載入一個類的請求交給父類載入器,如果父類不能載入,自己再進行載入

2.可見性:子類的載入器可以看到所有父類載入器載入的類,但是父類載入器不能看到子類載入器載入的類

3.單一性:僅載入一個類依次,這個特性是由委託機制保證子類載入器不會載入父類載入器載入過的類

總結一下就是:我所有的工作都由我的父親做,如果他做不了,我才去做,他的東西是我的,我的不是他的,所有的事情保證只做依次,==一次,避免工作的重複

java中提供了載入類的API,Class.forName()

類的載入時通過呼叫java.lang.ClassLoader的

 

loadClass()方法,loadclass()方法diao呼叫了findClass()方法來定位相應類的位元組碼,然後呼叫defineClass()方法來講將位元組碼轉換成類例項''

java判斷兩個java類是否相同的辦法:

1.檢查兩個類的全名是否相同

2.檢查兩個類的類載入器是否相同

代理模式(委託載入模式)是為了保證假把核心庫的型別安全,所有java應用都至少需要引用java.lang.Object類,如果這個載入過程是由自己的類載入器完成的,很可能就存在多個版本的java.lang.Object類,並且這些類之間是不相容的,通過java核心庫的類的載入工作由bootstrap類載入器來統一完成,保證了java應用所使用版本的java核心庫的類,是相互相容的

 

ClassNotFoundExceptionshsh是載入類的時候,該路徑下找不到對應的class檔案

NotClassDefFoundError是一個類中引用了另外的一個類,被引用的類已經被編譯過了,但是執行的時候class檔案不存在了

類載入器會首先代理給其他類載入器來嘗試載入某個類,這就意味著真正完成類的載入工作的類載入器和啟動zheg這個載入過程的類載入器,有可能不是同一個.真正完成類的載入工作是通過呼叫defineClass來shix實現的,啟動類的載入過程是通過呼叫loadClass來實現的,定義載入器是實際進行載入工作defineClass的類載入器,初始載入器是呼叫loadClassfang方法的類載入器

總結一下就是 哪個載入器發起的活動,哪個載入器實際執行的活動

Class.forName是一個ji靜態方法,用來載入類,最常見的用法是載入資料庫驅動的時候,如:Class.forName('org.apacapache.derby.jdbc.EmbeddedDriver').newInstance()用來載入Derby資料庫的驅動

對於執行在java EE容器中的Web應用來說,該類載入器也使用代理模式,所不同的是,他首先嚐試去載入某個類,如果找不到再代理給父類,目的是使得Web應用自己的類的優先順序高於Web容器提供的類,java核心庫的類是不使用代理模式的

Web應用的java類檔案存放在WEB-INF/classes目錄下

使用的庫的jar包是儲存在WEB-INF/lib目錄下

Web應用必須要有system library和java ee library

jre system library是jdk的庫

java ee library是servlet相關的庫

這兩個庫對於Web容器都是必須的

 

 

總結:

通過了解類載入器的知識學習到了java的執行流程:檔案由javawen檔案經過jre library編譯為class檔案,然後系統將class檔案轉換為機器碼,轉化為java.lang.class的一個例項,這一個例項就代表一個類

不同的類可能是不同的類載入器加載出來的

代理模式的使用,避免了所有的事情都是親力親為,但是在某些情況下,使用情況是不同的