反射的定義
正常方式:
????引入類所對應(yīng)的包名————實(shí)例化一個該類的對象————得到一個新的對象
反射方式:
????一個對象————getClass()方法————得到該類所屬的包名
????對象反射以后可以得到的信息:該類的屬性、方法和構(gòu)造器剂习,以及該類實(shí)現(xiàn)了哪些接口蛮位。
????對于每個類而言,不管它實(shí)例化了多少數(shù)量的對象鳞绕,java都為其保留有且僅有一個不變的Class類的對象失仁。每個Class對象都對應(yīng)著JVM(Java虛擬機(jī))創(chuàng)建的一個.class文件。
類的加載與ClassLoader的理解
加載
????將class文件的字節(jié)碼內(nèi)容加載到內(nèi)存中去们何,然后生成一個代表這個類的class對象萄焦。
鏈接(將Java類的二進(jìn)制代碼合并到JVM的運(yùn)行狀態(tài)之中的過程)
????這個階段會為類變量分配內(nèi)存并進(jìn)行初始化賦值,并將常量池中的常量的符號引用替換為直接引用。
初始化
執(zhí)行類的構(gòu)造器<clinit>()方法的過程拂封。類構(gòu)造器<clinit>()方法是由編譯期自動收集類中所有類變量的賦值動作和靜態(tài)代碼塊(static{})中的語句合并產(chǎn)生的茬射。
什么時候會發(fā)生類的初始化?
類的主動引用(會發(fā)生類的初始化)
1冒签、虛擬機(jī)啟動時在抛,會初始化main方法所在的類
2、new一個類的對象
3萧恕、調(diào)用類的靜態(tài)成員(除了final常量)和靜態(tài)方法
4刚梭、使用java.lang.reflect包的方法對類進(jìn)行反射調(diào)用
5、當(dāng)初始化一個類票唆,如果其父類沒有被初始化朴读,那么會先初始化它的父類。
類的被動引用(不會發(fā)生類的初始化)
1走趋、通過子類引用父類的初始化時衅金,不會導(dǎo)致子類初始化
2、通過數(shù)組定義類引用簿煌,不會觸發(fā)此類的初始化氮唯。
eg:現(xiàn)在有一個Student類。則下面代碼不會觸發(fā)該類的初始化:
? ? Student[] student = new Student[10];
3啦吧、訪問類的final常量時您觉,不會觸發(fā)類的初始化。(已在鏈接階段的最后一步將常量存入類的調(diào)用池中了)