日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
詳細(xì)介紹java類加載的表現(xiàn)形式

Java中的類是動態(tài)加載的,我們先看一下我們常用的類加載方式,先有一個感性的認(rèn)識,才能進(jìn)一步深入討論,類加載無非就是下面三種方式。

創(chuàng)新互聯(lián)建站:于2013年開始為各行業(yè)開拓出企業(yè)自己的“網(wǎng)站建設(shè)”服務(wù),為上千家公司企業(yè)提供了專業(yè)的網(wǎng)站制作、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計和網(wǎng)站推廣服務(wù), 按需制作由設(shè)計師親自精心設(shè)計,設(shè)計的效果完全按照客戶的要求,并適當(dāng)?shù)奶岢龊侠淼慕ㄗh,擁有的視覺效果,策劃師分析客戶的同行競爭對手,根據(jù)客戶的實(shí)際情況給出合理的網(wǎng)站構(gòu)架,制作客戶同行業(yè)具有領(lǐng)先地位的。

 
 
  1. class A{}  
  2. class B{}  
  3. class C{}  
  4. public class Loader{  
  5. public static void main(String[] args) throws Exception{  
  6. Class aa=A.class;   
  7. Class bb=Class.forName("B");  
  8. Class cc=ClassLoader.getSystemClassLoader().loadClass("C");  
  9. }  

我們先看.class字面量方式,很多人可能不知道這種方式,因?yàn)檫@種用法不是一般java語法。通過javap我們可以發(fā)現(xiàn),這種方式的大致等價于定義了一個靜態(tài)成員變量

 
 
  1. static Class class$0;(后面的編號是增長的) 

你可以試圖再定義一個 static Class class$0,應(yīng)該會收到一個編譯錯誤(重復(fù)定義)。

 
 
  1. Class aa=A.class; 

就相當(dāng)于

 
 
  1. if(class$0==null){  
  2. try{   
  3. Class.forName("A");  
  4. }  
  5. cacth(ClassNotFoundException e){  
  6. throw new NoClassDefFoundError(e);  
  7. }  
  8. }  
  9. Class aa=class$0; 

可以很清楚的看到,這種類的字面量定義其實(shí)不是加載類的方式,而是被編譯器處理了,實(shí)質(zhì)上是使用了Class.forName方法,但是使用這種方式有一個很大的好處就是不用處理異常,因?yàn)榫幾g器處理的時候如果找不到類會拋出一個NoClassDefFoundError。也許你覺得需要處理ClassNotFoundException這種異常,事實(shí)上99%的情況下我們可以把這種異常認(rèn)為是一個錯誤。所以大部分情況我們使用這種方式會更簡潔。

最常用的方式就是Class.forName方式了,這也是一個通用的上層調(diào)用。這個方法有兩個重載,可能很多人都忽略了第二個方法。

 
 
  1. public static Class forName(String name) throws ClassNotFoundException  
  2. public static Class forName(String name, boolean initialize,ClassLoader loader) 
  3. throws ClassNotFoundException 

第二個方法后面多了兩個參數(shù),第二個參數(shù)表示是否初始化,第三個參數(shù)為指定的類加載器。

在上面的例子中:

 
 
  1. Class bb=Class.forName("B"); 

等價于

 
 
  1. Class bb=Class.forName("B",true,Loader.class.getClassLoader()); 

這里要詳細(xì)說一下這個類的初始化這個參數(shù),如果這個參數(shù)為false的話,類中的static成員不會被初始化,static語句塊也不會被執(zhí)行。

也就是類雖然被加載了,但是沒有被初始化,不過在第一次使用時仍然會初始化。所以我們有時候會看到Class.forName("XXX").newInstance()這樣的語句,為什么這里要創(chuàng)建一個不用的實(shí)例呢?不過是為了保證類被初始化(兼容以前的系統(tǒng))。

其實(shí)第二個方法是比較難用的,需要指定類加載器,如果不指定而且又沒有安裝安全管理器的化,是無法加載類的,只要看一下具體的實(shí)現(xiàn)就明白了。

最本質(zhì)的方式當(dāng)然是直接使用ClassLoader加載了,所有的類最終都是通過ClassLoader加載的,

 
 
  1. Class cc=ClassLoader.getSystemClassLoader().loadClass("C"); 

這里通過使用系統(tǒng)類加載器來加載某個類,很直接的方式,但是很遺憾的是通過這種方式加載類,類是沒有被初始化的(也就是初始化被延遲到真正使用的時候).不過我們也可以借鑒上面的經(jīng)驗(yàn),加載后實(shí)例化一個對象Class cc=ClassLoader.getSystemClassLoader().loadClass("C").newInstance()。

這里使用了系統(tǒng)類加載器,也是最常用的類加載器,從classpath中尋找要加載的類。java中默認(rèn)有三種類加載器:引導(dǎo)類加載器,擴(kuò)展類加載器,系統(tǒng)類加載器。java中的類加載有著規(guī)范的層次結(jié)構(gòu),如果我們要了解類加載的過程,需要明確知道哪個類被誰加載,某個類加載器加載了哪些類等等,就需要深入理解ClassLoader的本質(zhì)。

以上只是類加載的表面的東西,我們還將討論深層次的東西。


文章題目:詳細(xì)介紹java類加載的表現(xiàn)形式
網(wǎng)頁URL:http://m.5511xx.com/article/dpcdgij.html