自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

詳細(xì)介紹java類(lèi)加載的表現(xiàn)形式

開(kāi)發(fā) 后端
本文介紹的是java類(lèi)加載的表現(xiàn)形式,希望對(duì)你有幫助,一起來(lái)看。

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

  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語(yǔ)法。通過(guò)javap我們可以發(fā)現(xiàn),這種方式的大致等價(jià)于定義了一個(gè)靜態(tài)成員變量

  1. static Class class$0;(后面的編號(hào)是增長(zhǎng)的) 

 

你可以試圖再定義一個(gè) static Class class$0,應(yīng)該會(huì)收到一個(gè)編譯錯(cuò)誤(重復(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

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

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

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

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

在上面的例子中:

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

等價(jià)于

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

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

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

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

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

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

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

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

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

責(zé)任編輯:于鐵 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2009-08-04 14:06:39

ASP.NET屬性表現(xiàn)

2010-06-09 14:43:27

2022-06-10 10:00:04

數(shù)字孿生監(jiān)管運(yùn)營(yíng)流程

2016-02-24 11:25:43

DevOps運(yùn)維

2021-08-06 10:02:14

圖表餅圖聯(lián)系圖表

2020-08-20 09:49:10

物聯(lián)網(wǎng)數(shù)據(jù)技術(shù)

2011-07-12 10:24:17

類(lèi)加載反射

2023-03-20 00:04:07

2021-06-10 18:59:41

Java編程語(yǔ)言

2010-03-16 14:58:15

Java類(lèi)加載器

2017-07-12 16:07:49

大數(shù)據(jù)數(shù)據(jù)可視化

2023-04-14 17:47:47

2011-07-18 10:21:04

iOS Visual Stu iphone

2009-09-15 13:20:34

LINQ DataCo

2010-08-24 09:19:59

2011-11-03 13:18:19

交換機(jī)故障方法

2021-04-07 06:11:37

Css前端CSS定位知識(shí)

2021-09-09 16:44:30

數(shù)字人民幣移動(dòng)支付中國(guó)人民銀行

2022-11-30 16:12:42

智慧城市智慧農(nóng)業(yè)物聯(lián)網(wǎng)

2021-08-28 07:48:04

AndroidActivityRecActivitySta
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)