1. 程式人生 > >Java——深入理解Class物件(一):什麼是Class物件

Java——深入理解Class物件(一):什麼是Class物件

Class類是我們再熟悉不過的東西,但是對於Class物件,很多人卻是一臉懵逼。

Class物件到底是什麼呢?今天我們就來深入瞭解一下它。

1.RTTI的概念

RTTI(Run-Time Type Identification),即執行時型別識別,這個詞一直是 C++ 中的概念,至於Java中出現RRTI的說法則是源於《Thinking in Java》一書,其作用是在執行時識別一個物件的型別和類的資訊。

RTTI分兩種:傳統的”RTTI”與反射機制。

對於傳統的“RTTI”,它假定我們在編譯期已知道了所有型別(在沒有反射機制建立和使用類物件時,一般都是編譯期已確定其型別,如new物件時該類必須已定義好)。

另外一種是反射機制,它允許我們在執行時發現和使用型別的資訊。在Java中用來表示執行時型別資訊的對應類就是Class類。


2.Class類

Class類也是一個實實在在的類,存在於JDK的java.lang包中,其部分原始碼如下:

public final class Class<T> implements java.io.Serializable,GenericDeclaration,Type, AnnotatedElement {
    private static final int ANNOTATION= 0x00002000;
    private static final int ENUM      = 0x00004000;
    private static final int SYNTHETIC = 0x00001000;

    private static native void registerNatives();
    static {
        registerNatives();
    }

    /*
     * Private constructor. Only the Java Virtual Machine creates Class objects.(私有構造,只能由JVM建立該類)
     * This constructor is not used and prevents the default constructor being
     * generated.
     */
    private Class(ClassLoader loader) {
        // Initialize final field for classLoader.  The initialization value of non-null
        // prevents future JIT optimizations from assuming this final field is null.
        classLoader = loader;
    }

物件是類的例項化,那麼既然Class類是真實存在,那麼自然也可以被例項化。而Class的建立的例項就是Class物件。

3.Class物件

上文說到Class類被建立後的物件就是Class物件,這裡需要注意,Class物件表示的是自己手動編寫類的型別資訊。

這是什麼意思呢?比如建立一個Searchin類,那麼,JVM就會建立一個Searchin對應Class類的Class物件,該Class物件則儲存了Searchin類相關的型別資訊。

實際上在Java中每個類都有且只有一個Class物件。

每當我們編寫並且編譯一個新建立的類就會產生一個對應Class物件並且這個Class物件會被儲存在同名.class檔案裡。說到.class檔案,大家可能很熟悉,因為Java程式編譯之後就會有.class檔案。事實上,編譯後的位元組碼檔案儲存的就是Class物件。

那為什麼需要這樣一個Class物件呢?

是這樣的,當我們new一個新物件或者引用靜態成員變數時,Java虛擬機器(JVM)中的類載入器子系統會將對應Class物件載入到JVM中,然後JVM再根據這個型別資訊相關的Class物件建立我們需要例項物件或者提供靜態變數的引用值。也就是說,Class物件對於類的例項化具有非常重要的意義。沒它就沒法new新物件和引用靜態成員變數。

這裡需要再次重點提醒一下,上文說到“Java中每個類只有一個Class物件”,這句話是什麼意思呢?

對於手動編寫的每個Class類,無論建立多少個例項物件,在JVM中都只有一個Class物件,即在記憶體中每個類有且只有一個相對應的Class物件。

這裡給大家畫個簡單的圖,方便大家理解。

4.總結

通過上文所提及知識,我們可以得出以下幾點資訊:

  • Class類也是類的一種,與class關鍵字是不一樣的。
  • 手動編寫的類被編譯後會產生一個Class物件,其表示的是建立的類的型別資訊,該Class物件儲存在同名.class的檔案中(即編譯後得到的位元組碼檔案)。
  • 每個通過關鍵字class標識的類,在記憶體中有且只有一個與之對應的Class物件來描述其型別資訊,無論建立多少個例項物件,其依據的都是用一個Class物件。
  • Class類只存私有建構函式,因此對應Class物件只能有JVM建立和載入
  • Class類的物件的作用是執行時提供或獲得某個物件的型別資訊,這點對於反射技術很重要。

 

 

 

 

Biu~~~~~~~~~~~~~~~~~~~~宫å´éªé¾ç«è¡¨æå|é¾ç«gifå¾è¡¨æåä¸è½½å¾ç~~~~~~~~~~~~~~~~~~~~~~pia!

參考文章:https://blog.csdn.net/javazejian/article/details/70768369