1. 程式人生 > >java Class類的理解

java Class類的理解

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

一 Class類是什麼:java.lang包裡的一個類,只是名字和class很像,java區分大小寫

二 Class類的作用

1 Class類的例項什麼時候建立,如何建立,這裡有兩種說法,不過不影響我們的理解(我認為是jvm載入類的時候加上的)

(1)java原始檔被編譯成java位元組碼(class檔案)時,會在這個位元組碼檔案中加上一個Class物件

(2)jvm在載入類的時候會加上一個Class物件

2 所有的java物件共用這一個Class物件,Class物件是和類定義放在一起的。

3 作用:但我們新建一個類的例項(物件)或者引用類的靜態變數的時候,JVM是根據這個類的屬性class物件建立例項物件或者提供靜態變數的引用值。比如:Person person = new Person(); 首先去載入Person.class,然後找Person.class中的Person.class物件,沒有找到就載入Person.class物件,然後根據Person.class物件去建立Person的例項物件p。

4 這裡有個地方比較拗口:類的class屬性是Class類的例項,這個class物件的內容是類的資訊。

例如:Person.class的內容是Person類的資訊(成員變數、方法等等)

三 獲取Class例項物件的三種方法

1 類名.class(jvm載入類的時候新增的class屬性)

2 Class.forName("類的全名")(Class的方法,最後是呼叫的Class的native方法forName0(),這個用得比較多,Class.forName("com.mysql.jdbc.Driver").newInstance()

說明:再呼叫Class.forName("xxx")的時候,JVM會載入這個類,如果你的這個類中有static程式碼塊,這個時候,static程式碼塊會執行。為什麼要用Class.forName("com.mysql.jdbc.Driver")?只是為了在編譯器確定有沒有驅動,其實import com.mysql.jbdc.Driver是一樣的。

3 例項物件.getClass()(用的是Object的native方法getClass)

三 Class類和java反射機制

1 Class類是java反射機制的源頭

2 spring IOC中java反射的運用,虛擬碼舉例:

一般的bean的配置:<bean id="test" class="com.indi.wangx.Test">

在spring中:

Class<T> class = Class.forName("com.indi.wangx.Test");

T t = class.newInstance();

contanier.put(t)(contanier是IOC容器)