帶你搞懂JAVA反射機制(總結分享)
本篇文章為大家帶來了關於java的相關知識,其中主要介紹了反射機制的相關問題,包括了什麼是反射、反射能夠做什麼、反射相關API等等,希望對大家有幫助。
推薦學習:《java學習教學》
1、什麼是反射?
在java開發中有一個非常重要的概念就是java反射機制,也是java的重要特徵之一。
反射的概念是由Smith在1982年首次提出的,主要是指程式可以存取、檢測和修改它本身狀態或行為的一種能力,透過反射可以呼叫私有方法和私有屬性,大部分框架也都是運用反射原理的。
Reflection(反射)是被視為動態語言的關鍵,反射機制允許程式在執行期借助於Reflection API取得任何
類別的內部信息,並能直接操作任意物件的內部屬性及方法。
一個類別有多個組成部分,例如:成員變數、方法、建構方法等,反射就是載入類別,並解剖出類別的各個組成部分。
2、反射能夠幹嘛?
Java的反射機制它知道類別的基本結構,這種對Java類別結構探知的能力,我們稱為Java類別的「自審」。如eclipse中,一按點,編譯工具就會自動的把該物件能夠使用的所有的方法和屬性全部都列出來,供使用者進行選擇。這就是利用了Java反射的原理,是對我們創造物件的探知、自審。
反射能夠做到:
- 在執行階段判斷任意一個物件所屬的類別;
- 在執行時建構任意一個類別的物件;
- 在執行階段判斷任意一個類別所具有的成員變數和方法;
- 在執行時取得泛型資訊;
- 在執行階段呼叫任意一個物件的成員變數和方法;
- 在執行是處理註解;
- 產生動態代理;
3、反射相關API
- ##java .lang.Class
:反射的源頭
- java.lang.reflect.Method
:方法
- java.lang.reflect.Field
:屬性
- java.lang.reflect.Constructor
:建構子
…
(1)、介紹:
程式經過javac.exe指令以後,會產生一個或多個字節碼檔案(.class結尾)。接著我們使用java.exe指令對某個字節碼檔進行解釋運行。相當於將某個字節碼檔案載入到記憶體中。此過程就稱為類別的載入。載入到記憶體中的類,我們就稱為運行時類,此運行時類,就作為Class的實例。
換句話說,Class的實例就對應著一個執行時間類別。 載入到記憶體中的運行時類,會快取一定的時間。在此時間之內,我們可以透過不同的方式 來取得此運行時類別。
(2)、類別的載入程序:
#載入:
在我們new物件或使用Class.forName("套件名稱.類別")時類別載入器
(ClassLoader)會將類別載入到記憶體中,並且建立一個Class物件
如何取得Class物件?
- 類別.
class
- 對象.
getClass()
Class.forName
(“套件名稱.類別”);
連結:
連結所做的工作主要是驗證字節碼是否合法,為static 分配記憶體空間並且初始化(並非真正的初始化,只是將對應類型的變數給上預設值,例如int給0,double給0.0)#卸載:##從記憶體中卸載(不需要我們關心何時卸載,由JVM去做)
(3)類別載入器類別(CLASS) 只有被載入到JVM 後才能執行。當執行指定程式時,JVM會將編譯產生的.class檔案依照需求和一定的規則載入到記憶體中,組織成為一個完整的Java應用程式。這個載入的過程是由類別載入器來完成的,具體來說,就是由ClassLoader和它的子類別來實現的。類別載入器本身也是一個類,其實質是把類檔案從硬碟讀取到記憶體中!
類別載入器的分類:
-
BootStrap:
主要負責載入核心的類別庫(java.lang.*
等),建構ExtClassLoader
和APPClassLoader
; -
ExtClassLoader:
主要負責載入jre/lib/ext目錄下的一些擴充的jar套件; -
AppClassLoader:
主要負責載入應用程式的主函數類別(自己寫的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中檢查是否載入過,如果有那就無需再載入了。如果沒有,那麼會拿到父載入器,然後呼叫父載入器的loadClass方法。父類中同理也會先檢查自己是否已經加載過,如果沒有再往上走。注意這個類似遞歸的過程,直到到達Bootstrap classLoader之前,都是在檢查是否載入過,並且不會選擇自己去載入。直到BootstrapClassLoader,已經沒有父加載器了,這時候開始考慮自己是否能加載了,如果自己無法加載,會下沉到子加載器去加載,一直到最底層,如果沒有任何加載器能加載,就會拋出ClassNotFoundException。那麼有人就有下面這種疑問了呢?
為什麼要設計這種機制
這種設計有個好處是,如果有人想替換系統層級的類別:String.java。篡改它的實現,在這種機制下這些系統的類別已經被Bootstrap classLoader載入過了(為什麼?因為當一個類別需要載入的時候,最先去嘗試載入的就是BootstrapClassLoader),所以其他類別載入器並沒有機會再去加載,從一定程度上防止了危險代碼的植入。
推薦學習:《java教學》
以上是帶你搞懂JAVA反射機制(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4
