java基礎知識---反射與new的概念


概述:之前在學習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,這樣你啟動程序(初始化)的時候這些模塊不會被加載,而是在運行的時候,用到那個模塊就調用哪個模塊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM