java反射詳解
1.什麼是反射
反射是一種間接操作目標物件的機制,在程式程式執行時(動態)獲取或者設定物件自身的資訊。 只要給定類的名字,就可以通過反射獲取類的所有信息,接著便能呼叫它的任何一個方法和屬性。
Java反射就是在執行狀態中,對於任意一個類,只要知道類名,就能夠得到或者知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;並且能改變它的屬性。而這也是Java被視為動態(或準動態,為啥要說是準動態,因為一般而言的動態語言定義是程式執行時,允許改變程式結構或變數型別,這種語言稱為動態語言。從這個觀點看,Perl,Python,Ruby是動態語言,C++,Java,C#不是動態語言。)語言的一個關鍵性質。
2.反射機制的作用
1 )在執行時判斷任意一個物件所屬的類。(通過 物件.getclass() 可以知道該物件是屬於哪個類的)
2 )在執行時判斷任意一個類所具有的成員變數和方法。( 類物件.get...方法)
3 )在執行時任意呼叫一個物件的方法( 物件)
4 )在執行時構造任意一個類的物件
3.反射的步驟
1 //1、通過物件呼叫 getClass() 方法來獲取,通常應用在:比如你傳過來一個 Object 2 //型別的物件,而我不知道你具體是什麼類,用這種方法 3 Person p1 = new Person(); 4 Class c1 = p1.getClass(); 5 6 //2、直接通過 類名.class 的方式得到,該方法最為安全可靠,程式效能更高 7 //這說明任何一個類都有一個隱含的靜態成員變數 class 8 Class c2 = Person.class; 9 10 //3、通過 Class 物件的 forName() 靜態方法來獲取,用的最多, 11 //但可能丟擲 ClassNotFoundException 異常 12 Class c3 = Class.forName("com.ys.reflex.Person");
來源: ofollow,noindex" target="_blank">https://www.cnblogs.com/ysocean/p/6516248.html
4.哪裡用到反射機制
可 以通過配置檔案來動態配置和載入類,以實現軟體工程理論裡所提及的類與類,模組與模組之間的解耦。反射最經典的應用是 spring 框架。
j dbc 中有一行程式碼: Class.forName('com.SQL/">MySQL.jdbc.Driver.class').newInstance(); 那個時候只知道生成驅動物件例項,後來才知道,這就是反射,現在 很多框架都用到反射機制, hibernate , struts 都是用反射機制實現的。
5.反射機制的優缺點
靜態編譯:在編譯時確定型別,繫結物件,即通過
動態編譯:執行時確定型別,繫結物件。動態編譯最大限度的發揮了 java 的靈活性,體現了多型的應用,有利於降低類之間的耦合性。
一句話,反射機制的優點就是可以實現動態建立物件和編譯,體現出很大的靈活性,特別是在 J2EE 的開發中
它的靈活性就表現的十分明顯。比如,一個大型的軟體,不可能一次就把把它設計的很完美,當這個程式編
譯後,釋出了,當發現需要更新某些功能時,我們不可能要使用者把以前的解除安裝,再重新安裝新的版本,假如
這樣的話,這個軟體肯定是沒有多少人用的。採用靜態的話,需要把整個程式重新編譯一次才可以實現功能
的更新,而採用反射機制的話,它就可以不用解除安裝,只需要在執行時才動態的建立和編譯,就可以實現該功
能。
它的缺點是對效能有影響。使用反射基本上是一種解釋操作,我們可以告訴 JVM ,我們希望做什麼並且它
滿足我們的要求。這類操作總是慢於只直接執行相同的操作。
6.java反射API
3. JAVA 反射 API
反射 API 用來生成在當前 JAVA 虛擬機器中的類、介面或者物件的資訊。
Class 類 : 反射的核心類,可以獲取類的屬性,方法等內容資訊。
Field 類 :Java.lang.reflect. 表示類的屬性,可以獲取和設定類的中屬性值。
Method 類 :Java.lang.reflect 。表示類的方法,它可以用來獲取類中方法的資訊或者執行方法
Construcor 類 :Java.lang.reflect 。表示類的構造方法。
通過 Class 類獲取成員變數、成員方法、介面、超類、構造方法等
查閱 API 可以看到 Class 有很多方法:
getName():獲得類的完整名字。
getFields():獲得類的public型別的屬性。
getDeclaredFields():獲得類的所有屬性。包括private 宣告的和繼承類
getMethods():獲得類的public型別的方法。
getDeclaredMethods():獲得類的所有方法。包括private 宣告的和繼承類
getMethod(String name, Class[] parameterTypes):獲得類的特定方法,name引數指定方法的名字,parameterTypes 引數指定方法的引數型別。
getConstructors():獲得類的public型別的構造方法。
getConstructor(Class[] parameterTypes):獲得類的特定構造方法,parameterTypes 引數指定構造方法的引數型別。
newInstance():通過類的不帶引數的構造方法建立這個類的一個物件。
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">