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容器)