為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

說起Java的反射機制,大家應該不陌生吧,她是Java語言多態的一種體現。但是在面試過程中,我發現很多人都只是停留在聽說過的層面,並沒有知其所以然,今天我們就來探討下。

為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

大部分人最早接觸的反射代碼,是JDBC的那一行Class.forName代碼。為什麼我們在實際的Java項目中很少用到反射,因為框架都幫我們做掉啦,像Spring、Mybatis、Druid等主流框架,無一離不開反射機制。

為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

一、反射機制

Java反射機制是在運行狀態中,對於任意一個類,都能夠獲取這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性。這種動態獲取類信息以及動態調用對象內容就稱為Java語言的反射機制。

簡單的來說,反射機制指的是程序在運行時能夠獲取自身的信息。在Java中,只要給定類的名字, 那麼就可以通過反射機制來獲得類的所有信息。

為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

二、反射的實現

要使用一個類,就要先把它加載到虛擬機中,生成一個Class對象。這個Class對象就保存了這個類的一切信息。反射機制的實現,就是獲取這個Class對象,通過Class對象去訪問類、對象的元數據以及運行時的數據。

為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

1、獲取Class對象的三種方式

  • 使用 Class 類中的 forName()靜態方法
  • 調用某個對象的 getClass()方法(需要new對象)
  • 調用某個類的 class 屬性來獲取該類對應的 Class 對象

2、創建Class對象的兩種方法

  • Class 對象的 newInstance()。使用 Class 對象的 newInstance()方法來創建該 Class 對象對應類的實例,但是這種方法要求該 Class 對象對應的類有默認的空構造器。
  • 調用 Constructor 對象的 newInstance()。先使用 Class 對象獲取指定的 Constructor 對象,再調用 Constructor 對象的 newInstance()方法來創建 Class 對象對應類的實例,通過這種方法可以選定構造方法創建實例。
為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

三、關於反射機制的幾點思考

Java中為什麼要用反射機制?直接創建對象不就可以了嗎,我覺得這主要涉及到了動態與靜態的問題。

  • 靜態編譯:在編譯時確定類型,綁定對象,即通過。
  • 動態編譯:運行時確定類型,綁定對象。動態編譯最大限度發揮了java的靈活性,體現了多 態的應用,有以降低類之間的耦合性。
為什麼幾乎所有的Java框架都要用到反射機制,她的魅力在哪裡?

從實際的編程使用來看,我對反射機制有幾點思考,分享給大家。個人覺得,反射機制的優勢很明顯:她可以實現動態創建對象和編譯,體現出語言很大的靈活性,這也是反射被廣泛用於各種框架中的最主要原因。

但是反射機制的缺點也是顯而易見的:對性能有影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它滿足我們的要求。這類操作總是慢於只直接執行相同的操作,同時在運行時動態編譯也會比較消耗內存


分享到:


相關文章: