Java深入 | 對象如何創建&Class對象

一、基本概念

(1)Class對象 
類型信息在運行時如何表示(RTTI),由Class對象的特殊對象完成,Class對象包含與類有關的信息。
類作爲程序中的一部分,每個類都有一個Class對象(即,每當編寫且編譯了一個新類,就會產生一個Class對象,這個對象被保存在一個同名的.class文件中)

簡述:

  Class 類是在Java語言中定義一個特定類的實現。一個類的定義包含成員變量,成員方法,還有這個類實現的接口,以及這個類的父類。Class類的對象用於表示當前運行的 Java 應用程序中的類和接口。 比如:每個數組均屬於一個 Class 類對象,所有具有相同元素類型和維數的數組共享一個Class 對象。基本的 Java 類型(boolean, byte, char, short, int, long, float 和 double) 和 void 類型也可表示爲 Class 對象。

  Java程序在運行時,Java運行時系統一直對所有的對象進行所謂的運行時類型標識。這項信息紀錄了每個對象所屬的類。虛擬機通常使用運行時類型信息選準正確方法去執行,用來保存這些類型信息的類是Class類。Class類封裝一個對象和接口運行時的狀態,當裝載類時,Class類型的對象自動創建。

  Class 沒有公共構造方法。Class 對象是在加載類時由 Java 虛擬機以及通過調用類加載器中的 defineClass 方法自動構造的,因此不能顯式地聲明一個Class對象。 
虛擬機爲每種類型管理一個獨一無二的Class對象。也就是說,每個類(型)都有一個Class對象。運行程序時,Java虛擬機(JVM)首先檢查是否所要加載的類對應的Class對象是否已經加載。如果沒有加載,JVM就會根據類名查找.class文件,並將其Class對象載入。一般某個類的Class對象被載入內存,它就用來創建這個類的所有對象。

(2)類加載器
爲了生成類的對象,運行這個程序的Java虛擬機(JVM)將使用類加載器。
類加載器實際上可以包含一條類加載器鏈,但是隻有一個原聲生類加載器(JVM實現的一部分),原生類加載器加載的是所謂的可信類(如 Java API,通常是本地磁盤加載)。在這條加載鏈中通常不需要額外類加載器,但如果有特殊需求(網絡中下載類等),可以掛接額外的類加載器。



二、對象的創建過程

(0)首先要生成Class對象,然後才能實例化 Instance

(1)當創建一個一個類,類加載器會檢查這個類的Class對象是否被加載。如果沒有加載默認的類加載器就會根據類名查找.class文件(加載字節碼過程中會進行檢查驗證,保證類沒有被破壞,保證安全),當某個類的Class對象被載入內存,他就被用來創建這個類的所有對象。
(2)所有的類在對其第一次使用時動態加載到JVM中。
當程序創建第一個對類的靜態成員的引用時會加載(證明構造器也是類的靜態方法,即使在構造器之前未使用static關鍵字),使用new操作符創建類的新對象會被當做對類的靜態成員的引用。
(3)動態加載:Java程序運行之前並非完全加載,在需要的時候進行加載

(4)Class對象的生成方式如下:
a、Class.forName("類名字符串")
b、類名.class

c、實例對象.getClass()



三、類的生命週期

類的生命週期

在一個類編譯完成之後,下一步就需要開始使用類,如果要使用一個類,肯定離不開JVM。在程序執行中JVM通過裝載,鏈接,初始化這3個步驟完成。

類的裝載是通過類加載器完成的,加載器將.class文件的二進制文件裝入JVM的方法區,並且在堆區創建描述這個類的java.lang.Class對象。用來封裝數據。 但是同一個類只會被類裝載器裝載以前

鏈接就是把二進制數據組裝爲可以運行的狀態。

 

鏈接分爲校驗,準備,解析這3個階段

校驗一般用來確認此二進制文件是否適合當前的JVM(版本),

準備就是爲靜態成員分配內存空間,。並設置默認值

解析指的是轉換常量池中的代碼作爲直接引用的過程,直到所有的符號引用都可以被運行程序使用(建立完整的對應關係)

完成之後,類型也就完成了初始化,初始化之後類的對象就可以正常使用了,直到一個對象不再使用之後,將被垃圾回收。釋放空間。

當沒有任何引用指向Class對象時就會被卸載,結束類的生命週期



三、方法

// 獲取該類的類裝載器。 
getClassLoader() 

//如果當前類表示一個數組,則返回表示該數組組件的 Class 對象,否則返回 null。 
getComponentType() 

//返回當前 Class 對象表示的類的指定的公有構造子對象
getConstructor(Class[]) 

//返回當前 Class 對象表示的類的所有公有構造子對象數組。 
getConstructors() 

//返回當前 Class 對象表示的類的指定已說明的一個構造子對象。 
getDeclaredConstructor(Class[]) 

//返回當前 Class 對象表示的類的所有已說明的構造子對象數組。 
getDeclaredConstructors() 

//返回當前 Class 對象表示的類或接口的指定已說明的一個域對象。 
getDeclaredField(String) 

//返回當前 Class 對象表示的類或接口的所有已說明的域對象數組。 
getDeclaredFields() 

//返回當前 Class 對象表示的類或接口的指定已說明的一個方法對象。 
getDeclaredMethod(String, Class[]) 

//返回 Class 對象表示的類或接口的所有已說明的方法數組。 
getDeclaredMethods() 

//返回當前 Class 對象表示的類或接口的指定的公有成員域對象。 
getField(String) 

//返回當前 Class 對象表示的類或接口的所有可訪問的公有域對象數組。 
getFields() 

//返回當前對象表示的類或接口實現的接口。 
getInterfaces() 

//返回當前 Class 對象表示的類或接口的指定的公有成員方法對象。 
getMethod(String, Class[]) 

//返回當前 Class 對象表示的類或接口的所有公有成員方法對象數組,包括已聲明的和從父類繼承的方法。 
getMethods() 

//返回該類或接口的 Java 語言修改器代碼。 
getModifiers() 

//返回 Class 對象表示的類型(類、接口、數組或基類型)的完整路徑名字符串。 
getName() 

//按指定名查找資源。 
getResource(String) 

//用給定名查找資源。 
getResourceAsStream(String) 

//獲取類標記。 
getSigners() 

//如果此對象表示除 Object 外的任一類, 那麼返回此對象的父類對象。 
getSuperclass() 

//如果 Class 對象表示一個數組則返回 true, 否則返回 false。 
isArray() 

//判定 Class 對象表示的類或接口是否同參數指定的 Class 表示的類或接口相同,或是其父類。 
isAssignableFrom(Class) 

//此方法是 Java 語言 instanceof 操作的動態等價方法。
isInstance(Object) 
 
//判定指定的 Class 對象是否表示一個接口類型。 
isInterface() 

//判定指定的 Class 對象是否表示一個 Java 的基類型。 
isPrimitive() 

//創建類的新實例。
newInstance() 
 
//將對象轉換爲字符串
toString() 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章