您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“JAVA反射機制時干什么的”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JAVA反射機制時干什么的”吧!
在java開發(fā)中有一個非常重要的概念就是java反射機制,也是java的重要特征之一。
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態(tài)或行為的一種能力,通過反射可以調(diào)用私有方法和私有屬性,大部分框架也都是運用反射原理的。
Reflection(反射)是被視為動態(tài)語言的關鍵,反射機制允許程序在執(zhí)行期借助于Reflection API取得任何
類的內(nèi)部信息,并能直接操作任意對象的內(nèi)部屬性及方法。
一個類有多個組成部分,例如:成員變量、方法、構造方法等,反射就是加載類,并解剖出類的各個組成部分。
Java的反射機制它知道類的基本結構,這種對Java類結構探知的能力,我們稱為Java類的“自審”。如eclipse中,一按點,編譯工具就會自動的把該對象能夠使用的所有的方法和屬性全部都列出來,供用戶進行選擇。這就是利用了Java反射的原理,是對我們創(chuàng)建對象的探知、自審。
反射能夠做到:
在運行時判斷任意一個對象所屬的類;
在運行時構造任意一個類的對象;
在運行時判斷任意一個類所具有的成員變量和方法;
在運行時獲取泛型信息;
在運行時調(diào)用任意一個對象的成員變量和方法;
在運行是處理注解;
生成動態(tài)代理;
java.lang.Class
:反射的源頭
java.lang.reflect.Method
:方法
java.lang.reflect.Field
:屬性
java.lang.reflect.Constructor
:構造器
…
程序經(jīng)過javac.exe命令以后,會生成一個或多個字節(jié)碼文件(.class結尾)。接著我們使用java.exe命令對某個字節(jié)碼文件進行解釋運行。相當于將某個字節(jié)碼文件加載到內(nèi)存中。此過程就稱為類的加載。加載到內(nèi)存中的類,我們就稱為運行時類,此運行時類,就作為Class的一個實例。
換句話說,Class的實例就對應著一個運行時類。
加載到內(nèi)存中的運行時類,會緩存一定的時間。在此時間之內(nèi),我們可以通過不同的方式
來獲取此運行時類。
在我們new對象或者使用Class.forName("包名.類")
時類加載器(ClassLoader)
會將類加載到內(nèi)存中,并且創(chuàng)建一個Class對象
如何獲取Class對象?
類.class
對象.getClass()
Class.forName
(“包名.類”);
鏈接所做的工作主要是驗證字節(jié)碼是否合法,為static 分配內(nèi)存空間并且初始化(并非真正的初始化,只是將對應類型的變量給上默認值,比如int給0,double給0.0)
從內(nèi)存中卸載(不需要我們關心何時卸載,由JVM去做)
類(CLASS) 只有被加載到 JVM 中后才能運行。當運行指定程序時,JVM會將編譯生成的.class文件按照需求和一定的規(guī)則加載到內(nèi)存中,組織成為一個完整的Java應用程序。這個加載的過程是由類加載器來完成的,具體來說,就是由ClassLoader和它的子類來實現(xiàn)的。類加載器本身也是一個類,其實質(zhì)是把類文件從硬盤讀取到內(nèi)存中!
類加載器的分類:
BootStrap:
主要負責加載核心的類庫(java.lang.*
等),構造ExtClassLoader
和APPClassLoader
;
ExtClassLoader:
主要負責加載jre/lib/ext目錄下的一些擴展的jar包;
AppClassLoader:
主要負責加載應用程序的主函數(shù)類(自己編寫的java文件是這個類加載器加載的);
System.out.println("app:" + System.getProperty("java.class.path")); System.out.println("ext:" + System.getProperty("java.ext.dirs")); System.out.println("----bootstrap---"); String[] str = System.getProperty("sun.boot.class.path").split(";"); for (String s : str) { System.out.println(s); }
雙親委托(派)機制:
當一個Hello.class這樣的文件要被加載時。不考慮我們自定義類加載器,首先會在AppClassLoader中檢查是否加載過,如果有那就無需再加載了。如果沒有,那么會拿到父加載器,然后調(diào)用父加載器的loadClass方法。父類中同理也會先檢查自己是否已經(jīng)加載過,如果沒有再往上。注意這個類似遞歸的過程,直到到達Bootstrap classLoader之前,都是在檢查是否加載過,并不會選擇自己去加載。直到BootstrapClassLoader,已經(jīng)沒有父加載器了,這時候開始考慮自己是否能加載了,如果自己無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException。那么有人就有下面這種疑問了?
為什么要設計這種機制
這種設計有個好處是,如果有人想替換系統(tǒng)級別的類:String.java。篡改它的實現(xiàn),在這種機制下這些系統(tǒng)的類已經(jīng)被Bootstrap classLoader加載過了(為什么?因為當一個類需要加載的時候,最先去嘗試加載的就是BootstrapClassLoader),所以其他類加載器并沒有機會再去加載,從一定程度上防止了危險代碼的植入。
到此,相信大家對“JAVA反射機制時干什么的”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關內(nèi)容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。