一 . 反射的概念 二 . 反射的作用 三. 反射的優缺點 優點:動態創建和編譯對象(靈活) 動態編譯:指程式在運行時確定對象類型,綁定對象。動態編譯最大限度的發揮了Java的靈活性,體現了多態的應用,降低了類之間的耦合性。bug一般會出在運行時期。反之為靜態編譯。 靜態編譯:在編譯期間確定對象類型 ...
一 . 反射的概念
- 反射的前提是知道類的名字
- 在java中,反射是一種機制,指程式在運行過程中,對於任何一個類都可以通過反射獲取其所擁有信息.
例如:成員變數(欄位),構造方法,方法,類名,包名,介面等。
二 . 反射的作用
- 在運行時判斷任意一個對象所屬的類。
- 在運行時獲取類的對象。
- 在運行時訪問Java對象的屬性,方法,構造方法等。
三. 反射的優缺點
優點:動態創建和編譯對象(靈活)
動態編譯:指程式在運行時確定對象類型,綁定對象。動態編譯最大限度的發揮了Java的靈活性,體現了多態的應用,降低了類之間的耦合性。bug一般會出在運行時期。反之為靜態編譯。
靜態編譯:在編譯期間確定對象類型,綁定對象,即通過,bug一般會出在編譯時期(不靈活)。
例子:一個大型的軟體,不可能一次就把它設計的很完美,當這個程式編譯後,發佈了。當發現需要更新某些功能時,我們不可能要求用戶把以前的卸載,再重新安裝新的版本。假如這樣的話,這個軟體肯定是沒有多少人用的。如果採用靜態編譯的話,就需要把整個程式都重新編譯一遍(重裝軟體),才可以實現功能的更新。而採用反射機制的話,就可以不用卸載,只需要在運行時才動態的創建和編譯,就可以實現功能的更新。
缺點:對性能有所影響。使用反射基本上是一種解釋操作,我們可以告訴JVM,我們希望做什麼並且它滿足我們的要求。這類操作總是慢於只執行相同的操作。
四. 反射的重點
類對象:類載入的產物,封裝了一個類的所有信息(類名、父類、介面、方法、構造方法)
類的對象:基於某個類new出來的對象,也稱為實例對象
關鍵字:Class
獲取類對象的三種方式:
類名.class ;
對象(類的對象).getClass() ;
Class.forName(包全名); // 例如 “java.util.ArrayList”
反射常用api
反射包為:Java.lang.reflect
Class
getName();以String的形式返回此Class對象所表示的實體(類、介面、數組類、基本類型或void)名稱。
getPackage();獲取此類的包。
===========================================
getFields();//獲取該Class的所有公開欄位(包括父類)
getField(String name);//根據name獲取對應的Field對象
getDeclaredFields();//獲取當前類的所有欄位;(不包括父類)
getDeclaredField(String name);//更具name匹配當前類相符合的類;
============================================
getMethods();//獲取此類和父類所有的公開方法
getMethod(String name,Class<?>... parameterTypes);//前一個參數為 方法名,後一個參數是入參,需要根據實際需求添加參數。
getDeclaredMethods();//獲取此類中所有的方法(不包括夫類);
getDeclaredMethod(String name,Class<?>... parameterTypes);//根據name和入參獲取相關方法對象。
============================================
至於其它方法,請參考jdkapi
我的感言:
反射是一們相對偏底層的技術,往往用在一個工具或者框架的實現上。反射在Java中雖然非常重要,我們不掌握好像也不是很影響開發,但是我還是建議您多學一點,咱們學技術的,得技術過硬!
作者:愛學習的小磊
出處:https://www.cnblogs.com/WangLei2018/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。