基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

Hello,今天給各位童鞋們分享的是Java反射,趕緊拿出小本子記下來吧

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

1。反射介紹

1.1 什麼是反射

Java 反射機制是 Java 語言一個很重要的特性,它使得 Java 具有了“動態性”。在 Java程式執行時,對於任意的一個類,我們能不能知道這個類有哪些屬性和方法呢?對於任意的一個物件,我們又能不能呼叫它任意的方法?答案是肯定的!這種動態獲取類的資訊以及動態呼叫物件方法的功能就來自於 Java 語言的反射(Reflection)機制。

1.2 反射的作用

簡單來說兩個作用,RTTI(執行時型別識別)和 DC(動態建立)。我們知道反射機制允許程式在執行時取得任何一個已知名稱的 class 的內部資訊,包括其 modifiers(修飾符),fields(屬性),methods(方法)等,並可於執行時改變 fields 內容或呼叫methods。那麼我們便可以更靈活的編寫程式碼,程式碼可以在執行時裝配,無需在元件之間進行原始碼連結,降低程式碼的耦合度;還有動態代理的實現等等;但是需要注意的是反射使用不當會造成很高的資源消耗!

Java 反射機制是 Java 語言一個很重要的特性,它使得 Java 具有了“動態性”。

反射機制的優點:

更靈活。

更開放。

反射機制的缺點:

降低程式執行的效率。

增加程式碼維護的困難。

2。 建立物件過程

2.1 建立 Java 物件的三個階段

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

2.2 建立物件時記憶體結構

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

實際上,我們在載入任何一個類時都會在方法區中建立“這個類對應的 Class 物件”,由於“Class 物件”包含了這個類的整個結構資訊,所以我們可以透過這個“Class 物件”來操作這個類。

我們要使用一個類,首先要載入類;載入完類之後,在堆記憶體中,就產生了一個 Class 型別的物件(一個類只有一個 Class 物件),這個物件就包含了完整的類的結構資訊。我們可以透過這個物件知道類的結構。這個物件就像一面鏡子,透過這個鏡子可以看到類的結構,所以,我們形象的稱之為:反射。 因此,“Class 物件”是反射機制的核心。

3。 反射的具體實現

3.1 獲取 Class 物件的三種方式

透過 getClass()方法。

透過。class 靜態屬性。

透過 Class 類中的靜態方法 forName()

3。1。1 建立Users類

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。1。2 透過 getClass()方法獲取 Class 物件

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。1。3 透過。class 靜態屬性獲取 Class 物件

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。1。4 透過 forName()獲取 Class 物件

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3.2 獲取類的構造方法

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。2。1 修改Users類

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。2。2 獲取構造方法

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。2。3 透過構造方法建立物件

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3.3 獲取類的成員變數

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。3。1 獲取成員變數

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。3。2 操作成員變數

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3.4 獲取類的方法

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。4。1 修改Users類

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

3。4。2 獲取方法並呼叫

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

4。 setAccessible 方法

setAccessible()方法:

setAccessible 是啟用和禁用訪問安全檢查的開關。值為 true 則指示反射的物件在使用時應該取消 Java 語言訪問檢查。值為 false 則指示反射的物件應該實施 Java 語言訪問檢查;預設值為 false。

由於 JDK 的安全檢查耗時較多,所以透過 setAccessible(true)的方式關閉安全檢查就可以達到提升反射速度的目的。

基礎到原始碼一套搞定,清華學霸最新整理的Java反射學習筆記太全了

好啦,今天的文章就到這裡了,希望能夠幫助到螢幕前迷茫的你們