一、反射的三種實(shí)現(xiàn)方式
- 對象.getClass()
- 類.class
- Class.forName("傳入需要反射的類路徑")
二、反射原理
1.Class.forName()方法實(shí)際上也是調(diào)用的CLassLoader(類加載器)來實(shí)現(xiàn)的。內(nèi)部實(shí)際調(diào)用的方法是forName0(className, true, ClassLoader.getClassLoader(caller), caller)
- className:表示我們要加載的類名(這里是類的全路徑名)
- true:指Class被加載后是不是必須被初始化。 不初始化就是不執(zhí)行static的代碼即靜態(tài)代碼,在這里默認(rèn)為true,也就是默認(rèn)實(shí)現(xiàn)類的初始化。
- ClassLoader.getClassLoader(caller):表示類加載器,到這你會發(fā)現(xiàn)forNanme其實(shí)也是使用的ClassLoader類加載器加載的。
- caller:指定類加載器。
2.classLoader
- 當(dāng)調(diào)用類時會觸發(fā)classLoader(JVM類加載器)
- JVM加載根據(jù)name到磁盤中找到對應(yīng)的.class文件并加載到內(nèi)存中
- 當(dāng).class對象加載入內(nèi)存后,JVM會自動創(chuàng)建應(yīng)該class對象。(一個類只會產(chǎn)生一個class對象,這個遵循了雙親委派模型)