java中最特殊的對象——Class對象

什麼是Class對象?

Class對象描述類的信息,對應着java.lang.Class類。類是對象的抽象,而Class類是對類信息的抽象。

 

 爲什麼需要Class對象?

1、當程序在運行時需要識別對象和類的信息時,就會需要用到Class對象中的信息。即RTTI(Run-Time Type Identification)運行時類型識別 ,是依賴Class對象來完成功能。java語言的多態性就是基於RTTI實現的。可見,Class對象非常重要!!

2、java的反射機制也要依賴Class對象來實現。(動態代理的實現依賴的是反射機制)

反射機制:即動態的獲取類和對象的信息以及動態調用類和對象的方法的功能。反射機制需要在運行時識別類和對象的信息,和RTTI不同的是,反射機制需要程序管理Class對象,而RTTI不需要(由JVM管理)。反射機制和RTTI的本質是一樣的,都是在運行時識別類和對象的信息。

 3、由1和2可知,在生成任何java對象(除了Class對象)之前,必須要先在內存中生成對應的Class對象供給程序使用。

 

如何獲取Class對象?(4種方式)

1、Class.forName("類的全限定名");

2、對象.getClass();

3、類.class;

4、ClassLoader.loadClass(String)

說明:調用Class.forName()會執行靜態初始化等初始化工作,而類.class則不會。此外,ClassLoader.loadClass(String)也是僅僅加載類,不執行類初始化;可以通過Class.forName(String, boolean, ClassLoader)第二個參數來僅僅加載類不執行初始化;

 

Class對象和類是一一對應的嗎?

不是。不同的加載器(ClassLoader)加載同一個類(同一個.class文件),獲得的Class對象是不相同的。但是,加載器的實現原理使用的是委派機制,這樣確保了同一個類只會被一個加載器所加載。除非故意而爲之,否則jvm緩存中某個類對應的Class對象是唯一的。

 

關於類的加載,參考:https://blog.csdn.net/m0_38075425/article/details/81627349

關於Class對象的詳解,參考:https://blog.csdn.net/mcryeasy/article/details/52344729

 

 覺得有用的老鐵贊一下唄!

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