天天看點

黑馬程式猿——JAVA高新技術——反射

                                              ----------android教育訓練、java教育訓練、java學習型技術部落格、期待與您交流!------------ 

一、對于反射的概念

對于JAVA反射機制是在執行狀态中,對于随意一個類。都可以知道這個類的全部屬性和方法;對于随意一個對象。都可以調用它的随意一個方法和屬性;這樣的動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。

JAVA反射(放射)機制:“程式執行時,同意改變程式結構或變量類型,這樣的語言稱為動态語言”。從這個觀點看,Perl,Python,Ruby是動态語言,C++。Java,C#不是動态語言。可是JAVA有着一個很突出的動态相關機制:Reflection,用在Java身上指的是我們能夠于執行時載入、探知、使用編譯期間全然未知的classes。

換句話說,Java程式能夠載入一個執行時才得知名稱的class,獲悉其完整構造(但不包含methods定義),并生成其對象實體、或對其fields設值、或喚起其methods。---------官方概念

二、對于我個人的了解

一,先看一下反射的概念:

              主要是指程式能夠訪問,檢測和改動它本身狀态或行為的一種能力。并能依據自身行為的狀态和結果。調整或改動應用所描寫叙述行為的狀态和相關的語義。

             反射是java中一種強大的工具。可以使我們非常友善的建立靈活的代碼。這些代碼可以再執行時裝配,無需在元件之間進行源碼連結。可是反射使用不當會成本非常高。

      二,反射機制的作用:

             1,反編譯:.class-->.java

             2,通過反射機制訪問java對象的屬性,方法。構造方法等;

             這樣好像更easy了解一些。下邊我們詳細看怎麼實作這些功能。

      三,在這裡先看一下sun為我們提供了那些反射機制中的類:

java.lang.Class;                

java.lang.reflect.Constructor; java.lang.reflect.Field;        

java.lang.reflect.Method;

java.lang.reflect.Modifier;

            非常多反射中的方法,屬性等操作我們能夠從這四個類中查詢。最好是查詢一下api文檔,更好的解決

          事實上概念僅僅是有助于你了解,更好的動手操作,才幹提高你的解決能力。

1,反射機制擷取類有三種方法。我們來擷取Employee類型

1.    //第一種方式:  

2.    Classc1 = Class.forName("Employee");  

3.    //另外一種方式:  

4.    //java中每一個類型都有class 屬性.  

5.    Classc2 = Employee.class;  

6.    //第三種方式:  

7.    //java語言中不論什麼一個java對象都有getClass 方法  

8.    Employeee = new Employee();  

9.    Classc3 = e.getClass(); //c3是執行時類 (e的執行時類是Employee)  

    2,建立對象:擷取類以後我們來建立它的對象,利用newInstance:

1.    Class c =Class.forName("Employee");  

2.      

3.    //建立此Class 對象所表示的類的一個新執行個體  

4.    Objecto = c.newInstance(); //調用了Employee的無參數構造方法.  

    3,擷取屬性:分為全部的屬性和指定的屬性:

      a,先看擷取全部的屬性的寫法:

//擷取整個類  

1.                Class c = Class.forName("java.lang.Integer");  

2.                  //擷取全部的屬性?  

3.                Field[] fs = c.getDeclaredFields();  

4.           

5.                       //定義可變長的字元串,用來存儲屬性  

6.                StringBuffer sb = new StringBuffer();  

7.                //通過追加的方法,将每一個屬性拼接到此字元串中  

8.                //最外邊的public定義  

9.                sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n");  

10.              //裡邊的每個屬性  

11.              for(Field field:fs){  

12.                  sb.append("\t");//空格  

13.                  sb.append(Modifier.toString(field.getModifiers())+" ");//獲得屬性的修飾符。比如public,static等等  

14.                  sb.append(field.getType().getSimpleName() + " ");//屬性的類型的名字  

15.                  sb.append(field.getName()+";\n");//屬性的名字+回車  

16.              }  

17.        

18.              sb.append("}");  

19.        

20.              System.out.println(sb);  

每天進步一點點,成功進步一大步,fighting!