首頁>Club>
5
回覆列表
  • 1 # 會點程式碼的大叔

    在學習 Java 反射之前,先讓我們看看這幾個概念。

    01. 解釋型語言和編譯型語言

    解釋型語言:不需要編譯,在執行的時候逐行翻譯解釋;修改程式碼時可以直接修改,可以快速部署,不過效能上會比編譯型語言稍差;比如 JavaScript、Python ;

    編譯型語言:需要透過編譯器將原始碼編譯成機器碼才能執行;編譯之後如果需要修改程式碼,在執行之前就需要重新編譯。比如 C 語言;

    Java 嚴格來說也是編譯型語言,但又介於編譯型和解釋型之間;Java 不直接生成機器碼而是生成中間碼:編譯期間,是將原始碼交給編譯器生成 class 檔案(位元組碼),這個過程中只做了翻譯的工作,並沒有把程式碼放入記憶體執行;當進入執行期,位元組碼才被 Java 虛擬機器載入、解釋成機器語言並執行。

    02. 動態語言和靜態語言

    動態語言:是指程式在執行時可以改變自身結構,在執行時確定資料型別,一個物件是否能執行某操作,只取決於它有沒有對應的方法,而不在乎它是否是某種型別的物件;比如 JavaScript、Python。

    靜態語言:相對於動態語言來說,在編譯時變數的資料型別就已經確定(使用變數之前必須宣告資料型別),在編譯時就會進行型別是否匹配;比如 C 語言、Java ;

    03. 反射的概念

    Java 反射機制:在執行過程中,對於任意一個類,都能知道其所有的屬性和方法;對於任意一個物件,都能呼叫其屬性和方法;這種動態獲取類資訊和呼叫物件方法的功能,就是 Java 反射機制。

    既然反射裡面有一個“反”字,那麼我們先看看何為“正”。

    在 Java 中,要使用一個類中的某個方法,“正向”都是這樣的:

    那麼反向(反射)要如何實現?

    兩段程式碼執行的結果是一樣的,但是“正向”程式碼在編譯前,就已經明確了要執行的類是什麼(ArrayList),而第二段程式碼,只有在程式碼執行時,才知道執行的類是 java.util.ArrayList。

    04. 反射的作用

    講到這裡,有些同學可能會有疑問:“反射有什麼用?我明明都已經知道了要使用的類是 ArrayList ,我不能直接 new 一個物件然後執行裡面的方法麼?”

    當然可以!不過很多場景中,在程式碼執行之前並不知道需要使用哪個類,或者說在執行的時候才決定使用哪個類;

    比如有這麼一個功能:“呼叫阿里雲的人臉識別 API ”;這還不簡單,參考對方的 API 文件,很快就能實現。

    上線一個月後,領導說:“咱公司開始和騰訊雲合作了,人臉識別的介面改一下吧”。

    修改上線運行了兩個月,領導說:“換回來吧”... ...

    當然有聰明的程式設計師會想到設定一個開關配置,讓開關決定走哪段程式碼邏輯,如果領導哪天想變成亞馬遜雲的服務,繼續寫 if-else 就好了:

    不過還有一種更好的方法:

    1. 定義一個介面:

    2. 多個實現類:

    3. 在呼叫人臉識別功能的程式碼中:

    如果上面這個例子,你依然覺得在呼叫方法中做 if-else 判斷,和使用反射實現並沒有差太多,但是如果程式設計師 A 提供介面,程式設計師 B 提供實現,程式設計師 C 寫客戶端呢?

    回憶一下 JDBC 的使用,比如建立一個連線:

    其中:

    程式設計師 A 提供介面:Oracle 公司(之前的 Sun)提供 JDBC 標準(介面)。程式設計師 B 提供實現:各個資料庫廠商提供針對自家資料庫的實現。程式設計師 C 寫客戶端:我等碼農在 Java 中敲程式碼訪問資料庫。

    總結一下Java 反射的作用:可以設計出更為通用和靈活的架構,很多框架為了保證其通用性,可以根據配置載入不用的類,這時候要用到反射。除此之外:

    動態代理:在不改變目標物件方法的情況下對方法進行增強,比如使用 AOP 攔截某些方法列印日誌,這就需要透過反射執行方法中的內容。註解:利用反射機制,獲取註解並執行對應的行為。05. 用反射的用法

    上文中我們知道了 Java 執行期的原始檔是 class 檔案(位元組碼),所以要使用反射,那麼就需要獲取到位元組碼檔案物件,在 Java 中,獲取位元組碼檔案物件有三種方式:

    呼叫某個類的 class 屬性:類名.class呼叫物件的 getClass() 方法:物件.getClass()使用 Class 類中的 forName() 靜態方法:Class.forName(類的全路徑) ,建議使用這種方法

    java.lang.reflect 類庫提供了對反射的支援:

    Field :可以使用 get 和 set 方法讀取和修改物件的屬性;Method :可以使用 invoke() 方法呼叫物件中的方法;Constructor :可以用 newInstance() 建立新的物件。06. 反射的優缺點

    優點:在執行時動態獲取類和物件中的內容,極大地提高系統的靈活性和擴充套件性;誇張一些說,反射是框架設計的靈魂。

    缺點:會有一定的效能損耗,JVM 無法對這些程式碼進行最佳化;破壞類的封裝性。

    總之,可能大家在平時的開發過程中,感覺自己並沒有寫過反射相關的程式碼,但是在我們用到的各種開源框架中,反射無處不在。

  • 2 # 營口宣銘科技

    沒人請,自己搬小板凳過來的,您的問題什麼事Java反射機制?

    反射機制就是指在你執行的狀態中,對於任意一個類,你都能夠知道這個類的所有屬性和方法;對於任意一個物件,也都能夠呼叫它的任意一個方法和屬性;這種動態獲取的資訊以及動態呼叫物件的方法的功能就被稱為java語言的反射機制。

  • 3 # 魯班學院Java學堂

    java的反射機制主要是指程式可以訪問,檢測和修改它本身狀態或行為的一種能力,並能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。

  • 4 # java架構設計

    Java反射的概念Java反射機制是指在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能被稱為Java語言的反射機制。反射的作用

    我們都知道程式設計師編寫的Java程式碼必須編譯成.class檔案才能在JVM中執行,如何不符合JVM的規範,則會在編譯期間報錯。那麼反射的意思和反編譯差不多,就是根據

    .class

    檔案獲取這個類的所有屬性和方法,且可以呼叫它的方法。

    正常方式:透過完整的類名 > 透過new例項化 > 取得例項化物件

    反射方式:例項化物件 > getClass()方法 > 透過完整的類名

    示例

    建立一個用於測試的類:

    TestReflect.java

    獲取類的三種方式:

    獲取類的所有屬性:

    獲取類的所有方法:

    獲取所有的構造方法:

    動態呼叫方法:

  • 5 # JAVA小學生

    JAVA反射機制是在執行狀態中,對於任意一個實體類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

    以上來自百度百科。

    我之前寫過一篇關於Java建立物件的文章,裡面提到了兩種Java的反射機制。

    第一種:利用

    Class.newInstance

    方式建立物件

    第二種:利用

    Constructor.newInstance

    方式建立物件

    Class.newInstance你內部也是呼叫了Constructor.newInstance。所以大多數的開源框架都會使用Constructor來實現反射。

  • 6 # 優就業浙江IT培訓

      一、什麼是反射機制

      簡單的來說,反射機制指的是程式在執行時能夠獲取自身的資訊。在java中,只要給定類的名字,那麼就可以透過反射機制來獲得類的所有資訊。

      二、哪裡用到反射機制

      有些時候,我們用過一些知識,但是並不知道它的專業術語是什麼,在jdbc時用過一行程式碼,Class.forName("com.mysql.jdbc.Driver.class").newInstance();原來這就是反射,現在很多開框架都用到反射機制,hibernate、struts都是用反射機制實現的。

      三、反射機制的優點與缺點

      為什麼要用反射機制?直接建立物件不就可以了嗎,這就涉及到了動態與靜態的概念,

      靜態編譯:在編譯時確定型別,繫結物件,即透過。

      動態編譯:執行時確定型別,繫結物件。動態編譯最大限度發揮了java的靈活性,體現了多型的應用,有以降低類之間的藕合性。

      一句話,反射機制的優點就是可以實現動態建立物件和編譯,體現出很大的靈活性,特別是在J2EE的開發中

      它的靈活性就表現的十分明顯。比如,一個大型的軟體,不可能一次就把把它設計的很完美,當這個程式編譯後,釋出了,當發現需要更新某些功能時,我們不可能要使用者把以前的解除安裝,再重新安裝新的版本,假如這樣的話,這個軟體肯定是沒有多少人用的。採用靜態的話,需要把整個程式重新編譯一次才可以實現功能的更新,而採用反射機制的話,它就可以不用解除安裝,只需要在執行時才動態的建立和編譯,就可以實現該功能。

      它的缺點是對效能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它滿足我們的要求。這類操作總是慢於只直接執行相同的操作。

  • 中秋節和大豐收的關聯?
  • 《一人之下》:你是否支援諸葛青和王也的“也青”組合,諸葛青有官配嗎?