概述:之前在學習spring框架時,重點了解了一些依賴注入(即:控制反轉),這里最核心的概念就是反射的機制,那么我今天將沖3個方面了梳理一下new和反射的概念
1、new只有在知道類名之后才能new,而反射有時候不需要
反射實例對象的方式
-->知道類名的情況:
Class<?> c1 = Class.forName("cn.classes.OneClass");
Class<?> c2 = new OneClass.getClass();
Class<?> c3 = OneClass.class();
-->不知道類名的情況:通過動態代理實現的
(
首先jvm在其內部通過函數ProxyGenerator.generateProxyClass()方法來生成代理對象的字節碼文件(其實就沒有具
體文件,一切都是在內存中,暫時就這么叫吧),然后defineClass0()函數利用之前生成的二進制字節碼文件來創建
類Class對象,並順便為代理類命名(proxyName是在字節碼文件生成之前自己命名的),經過這個過程我們就可以在不
知道類名的情況下得到了類Class對象了,然后就可以使用反射來獲取對象實例了(這其中牽扯到類加載的加載過程,
具體內容請詳看有關資料)
)
2、new出來的對象中,我們是無法反問她的私有屬性,而反射可以(通過setAccessible()取訪問)
3、new屬於靜態編譯,而反射屬於動態編譯,靜態編譯就是在編譯的時候把你所有的模塊都編譯進exe里去,當你啟動這個exe的時候所有模塊都加載進來了。你寫小程序沒問題,但程序一大,加載的過程(就是當你運行程序時初始化的過程)就比較費力了。。大多數ppc的硬件配置還是很一般的。動態編譯就不一樣了,你編譯的時候那些模塊都沒有編譯進去,一般情況下你可以把那些模塊都編譯成dll,這樣你啟動程序(初始化)的時候這些模塊不會被加載,而是在運行的時候,用到那個模塊就調用哪個模塊。
