java的反射

反射的定義

正常方式:

????引入類所對應的包名————實例化一個該類的對象————得到一個新的對象


反射方式:

????一個對象————getClass()方法————得到該類所屬的包名


????對象反射以后可以得到的信息:該類的屬性、方法和構造器,以及該類實現(xiàn)了哪些接口。

????對于每個類而言,不管它實例化了多少數(shù)量的對象,java都為其保留有且僅有一個不變的Class類的對象。每個Class對象都對應著JVM(Java虛擬機)創(chuàng)建的一個.class文件。


類的加載與ClassLoader的理解

加載

????將class文件的字節(jié)碼內容加載到內存中去,然后生成一個代表這個類的class對象。


鏈接(將Java類的二進制代碼合并到JVM的運行狀態(tài)之中的過程)

????這個階段會為類變量分配內存并進行初始化賦值,并將常量池中的常量的符號引用替換為直接引用。


初始化

執(zhí)行類的構造器<clinit>()方法的過程。類構造器<clinit>()方法是由編譯期自動收集類中所有類變量的賦值動作和靜態(tài)代碼塊(static{})中的語句合并產(chǎn)生的。


什么時候會發(fā)生類的初始化?

類的主動引用(會發(fā)生類的初始化)

1、虛擬機啟動時,會初始化main方法所在的類

2、new一個類的對象

3、調用類的靜態(tài)成員(除了final常量)和靜態(tài)方法

4、使用java.lang.reflect包的方法對類進行反射調用

5、當初始化一個類,如果其父類沒有被初始化,那么會先初始化它的父類。

類的被動引用(不會發(fā)生類的初始化)

1、通過子類引用父類的初始化時,不會導致子類初始化

2、通過數(shù)組定義類引用,不會觸發(fā)此類的初始化。

eg:現(xiàn)在有一個Student類。則下面代碼不會觸發(fā)該類的初始化:

? ? Student[] student = new Student[10];

3、訪問類的final常量時,不會觸發(fā)類的初始化。(已在鏈接階段的最后一步將常量存入類的調用池中了)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容