乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      運行時類型識別——Class類(動態(tài)加載類)

       yliu277 2019-07-23

      一、RTTI

      RTTI(Run_Time Type Identification 運行時類型識別):

         RTTI是任何一門面對對象語言都必須提供的功能。不僅系統(tǒng)本身要利用該功能來識別目前正在運行的對象真正所屬的類別,程序員有時候也需要利用這一機(jī)制來識別對象,以設(shè)計程序作出適當(dāng)?shù)姆磻?yīng)。

         Java在運行期間查找對象和類的信息,主要采取以下兩種形式:

         (1)采用傳統(tǒng)的RTTI,它假定我們已在編譯和運行期間擁有所有類型

         (2)采用Java特有的“反射”機(jī)制,利用它可在運行期獨立查找類信息。

      說簡單點,Java提供了兩種方式來獲取對象的信息:一種是利用傳統(tǒng)的方法;一種是利用反射機(jī)制。

      二、Class

              Java API中這么解釋Class類:

        Class 類的實例表示正在運行的 Java 應(yīng)用程序中的類和接口, 枚舉是一種類,注釋是一種接口。每個數(shù)組屬于被映射為 Class 對象的一個類,所有具有相同元素類型和維數(shù)的數(shù)組都共享該Class 對象。 基本的 Java 類型(boolean、byte、charshort、int、long、floatdouble)和關(guān)鍵字 void 也表示為 Class 對象。

      注意:Class 沒有公共構(gòu)造方法。Class 對象是在加載類時由 Java 虛擬機(jī)以及通過調(diào)用類加載器中的defineClass 方法自動構(gòu)造的

              為了理解RTTI在Java例如何工作,首先必須了解類型信息在運行期間是如何表示的。只要用到一個名為'Class'的特殊形式的對象,這個對象包含了與類有關(guān)的信息(有時候也把它叫作“元類”)。事實上,要用Class類創(chuàng)建屬于某個類的全部“常規(guī)”或“普通”對象。

             任何一個作為程序一部分的類,都有一個Class對象。換言之,每次寫一個新類時,同時也會創(chuàng)建一個Class對象(更恰當(dāng)?shù)恼f,是保存在一個完全同名的.class文件中)。在運行期間,一旦程序員想要生成某一個類的對象,用于執(zhí)行程序的Java虛擬機(jī)(JVM)首先就會檢查該類型的Class對象是否已經(jīng)載入。若尚未載入,JVM就會查找同名的.class文件,并將其載入。所以,Java程序啟動時并不是完全載入的,這一點與許多傳統(tǒng)語言不同。一旦該類型的Class對象進(jìn)入內(nèi)存,就用它創(chuàng)建該類型的所有對象。

      三、Class動態(tài)加載類的三種方法

      (1)類名.Class

      (2)類型.getClass()

      (3)Class.forName('類名')  (這里的類名表示具體類名,所以要加上包名)

      補(bǔ)充:

      靜態(tài)加載類和動態(tài)加載類:

              編譯時刻加載的類是靜態(tài)加載類,例如用new關(guān)鍵字創(chuàng)建的對象要通過編譯器的靜態(tài)檢查,如果編譯時該類不存在,那么使用該對象的類也無法通過編譯。

             運行時刻加載的類是動態(tài)類,在編譯的時候不會進(jìn)行判斷,只有在運行時才會進(jìn)行判斷,假設(shè)該類不存在,在運行時才會報錯。

      例如下面的例子:

      Candy.java文件

      package com.test; public class Candy { static{ System.out.println('Loading Candy in static block'); } public static void main(String[] args){ System.out.println('Loading Candy in main method'); } }

      LoadClass.java文件:

      package com.test;
      
      public class LoadClass {
      	public static void main(String[] args){
      		System.out.println('Before loding Candy');
      		try {
      			//加載Candy對象
      			Class.forName('com.test.Candy');
      		} catch (ClassNotFoundException e) {
      			e.printStackTrace();
      		}
      	}
      }
      
      運行結(jié)果如下:

      Before loding Candy
      Loading Candy in static block

      從程序的輸出結(jié)果來看,用這種方式和new 來創(chuàng)建對象沒什么區(qū)別。其實,二者之間有很大的區(qū)別,用new 關(guān)鍵字創(chuàng)建對象要通過編譯器靜態(tài)檢查,如果編譯時Candy類不存在,那么使用Candy類對象的類LoadClass也無法通過編譯。而forName()方法時動態(tài)加載,即便編譯時Candy類不存在,編譯也是可以通過的,只是在運行時刻會拋出異常。

      注意:使用forName()方法存在一個問題,它返回的是一個Class類型,而不是加載的那個類型。所以,無法做出下面的聲明:

      Candy candy=Class.forName('com.test.Candy');
      而只能寫為:
      Class candy=Class.forName('com.test.Candy');
      也就是說,candy無法直接使用Candy類中定義的方法。解決的辦法是利用反射機(jī)制,不過這比直接用new來創(chuàng)建對象要麻煩得多。所以,用forName()加載對象多用在加載驅(qū)動程序的情況下(例如,加載數(shù)據(jù)庫驅(qū)動)

      下面舉個例子熟悉一下Class動態(tài)加載類的方法:

      package com.baseType; public class baseClass { public static void main(String[] args){ Class c1=int.class; //int的類類型 Class c2=String.class; //String類的類類型 Class c3=double.class; //double的類類型 Class c4=Double.class; //Double類的類類型 Class c5=void.class; //關(guān)鍵字void的類類型 //打印類類型的具體名稱 System.out.println(c1.getName()); //int System.out.println(c2.getName()); //java.lang.String System.out.println(c3.getName()); //double System.out.println(c4.getName()); //java.lang.Double System.out.println(c5.getName()); //void //不帶包名的類名稱 System.out.println(c2.getSimpleName()); //String System.out.println(c4.getSimpleName()); //Double } }


        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多