深入研究java.lang.Class類

來源:互聯網
上載者:User
前言:Java的類庫日益龐大,所包含的類和介面也不計其數。但其中有一些非常重要的類和介面,是Java類庫中的核心部分。常見的有String、Object、Class、Collection、ClassLoader...,熟悉這些類是學好Java的基礎。而這些類一般不容易理解,需要做深入的研究和實踐才能掌握。下面是我對這些類理解和使用的一些總結。歡迎你在閱讀後將你寶貴的意見和讀後感留下!

      Java程式在運行時,Java運行時系統一直對所有的對象進行所謂的運行時類型標識。這項資訊紀錄了每個對象所屬的類。虛擬機器通常使用運行時類型資訊選准正確方法去執行,用來儲存這些類型資訊的類是Class類。Class類封裝一個對象和介面運行時的狀態,當裝載類時,Class類型的對象自動建立。
      Class 沒有公用構造方法。Class 對象是在載入類時由 JAVA 虛擬機器以及通過調用類載入器中的 defineClass 方法自動構造的,因此不能顯式地聲明一個Class對象。
      虛擬機器為每種類型管理一個獨一無二的Class對象。也就是說,每個類(型)都有一個Class對象。運行程式時,Java虛擬機器(JVM)首先檢查是否所要載入的類對應的Class對象是否已經載入。如果沒有載入,JVM就會根據類名尋找.class檔案,並將其Class對象載入。
      基本的 Java 類型(boolean、byte、char、short、int、long、float 和 double)和關鍵字 void 也都對應一個 Class 對象。
      每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共用該 Class 對象。
      一般某個類的Class對象被載入記憶體,它就用來建立這個類的所有對象。

一、如何得到Class的對象呢?有三種方法可以的擷取:
    1、調用Object類的getClass()方法來得到Class對象,這也是最常見的產生Class對象的方法。例如:
    MyObject x;
    Class c1 = x.getClass();
    2、使用Class類的中靜態forName()方法獲得與字串對應的Class對象。例如:
    Class c2=Class.forName("MyObject"),Employee必須是介面或者類的名字。
    3、擷取Class類型對象的第三個方法非常簡單。如果T是一個Java類型,那麼T.class就代表了匹配的類對象。例如
    Class cl1 = Manager.class;
    Class cl2 = int.class;
    Class cl3 = Double[].class;
    注意:Class對象實際上描述的只是類型,而這類型未必是類或者介面。例如上面的int.class是一個Class類型的對象。由於曆史原因,數群組類型的getName方法會返回奇怪的名字。

二、Class類的常用方法
    1、getName()
    一個Class對象描述了一個特定類的屬性,Class類中最常用的方法getName以 String 的形式返回此 Class 對象所表示的實體(類、介面、數組類、基本類型或 void)名稱。

    2、newInstance()
    Class還有一個有用的方法可以為類建立一個執行個體,這個方法叫做newInstance()。例如:
    x.getClass.newInstance(),建立了一個同x一樣類型的新執行個體。newInstance()方法調用預設構造器(無參數構造器)初始化建立對象。

    3、getClassLoader()
    返回該類的類載入器。

    4、getComponentType()
    返回表示數組組件類型的 Class。

    5、getSuperclass()
    返回表示此 Class 所表示的實體(類、介面、基本類型或 void)的超類的 Class。

    6、isArray()
    判定此 Class 對象是否表示一個數組類。

三、Class的一些提示
    1、forName和newInstance結合起來使用,可以根據儲存在字串中的類名建立對象。例如
    Object obj = Class.forName(s).newInstance();

    2、虛擬機器為每種類型管理一個獨一無二的Class對象。因此可以使用==操作符來比較類對象。例如:
    if(e.getClass() == Employee.class)...

四、來自SUN公司的java.lang.Class類的API文檔,網上有chm中文版的,很好找。為了查閱方便,我從SUN公司的JavaDoc網站上複製出來了Class類的API文檔。  

java.lang
類 Class<T>
java.lang.Object  java.lang.Class<T>
所有已實現的介面:
Serializable, AnnotatedElement, GenericDeclaration, Type
public final class Class<T>
extends Object
implements Serializable, GenericDeclaration, Type, AnnotatedElement
Class 類的執行個體表示正在啟動並執行 Java 應用程式中的類和介面。枚舉是一種類,注釋是一種介面。每個數組屬於被映射為 Class 對象的一個類,所有具有相同元素類型和維數的數組都共用該 Class 對象。基本的 Java 類型( booleanbytecharshortintlongfloatdouble)和關鍵字 void 也表示為 Class 對象。

Class 沒有公用構造方法。 Class 對象是在載入類時由 JAVA 虛擬機器以及通過調用類載入器中的 defineClass 方法自動構造的。

以下樣本使用 Class 對象來顯示對象的類名:

     void printClassName(Object obj) {         System.out.println("The class of " + obj +                            " is " + obj.getClass().getName());     } 
還可以使用一個類字面值(JLS Section 15.8.2)來獲得命名類型(或 void)的 Class 對象。例如:

     System.out.println("The name of class Foo is: "+Foo.class.getName());
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.