反射的定義
正常方式:
????引入類所對應的包名————實例化一個該類的對象————得到一個新的對象
反射方式:
????一個對象————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ā)類的初始化。(已在鏈接階段的最后一步將常量存入類的調用池中了)