Java反射知識總結(2)——閱讀

       上一部分介紹了反射的一些基本內容,如今將利用反射完成更多的事情。框架

1、  Field類工具

      Field類封裝了屬性的信息,一個Field類封裝了一個屬性的信息,相似於Method對象封裝了方法的信息同樣。那麼如何獲取Field對象呢?在Class類中一般有如下兩個方法:spa

     一、Field  getDeclaredField(String name)                                    ----方法1調試

     二、Field  getField(String name)                                                  -----方法2對象

   是否是和獲取Method對象的方法很類似呢?不錯,獲取Field基本和獲取Method對象是一致的。繼承

    getField 方法能夠獲 得本類的公開屬性以及從父繼承到,可是沒法獲非公開屬性;而getDeclaredField方法只能得到本類屬性,但這包括的本類的非公開屬性。get

   例如:要獲取Student類的name屬性的Field對象,可使用以下的代碼:編譯器

     Class c=Student.class;編譯

     Field nameField=c.getField("name");class

   這樣就獲取到了對應的Field對象。

 

  那麼獲取到Field對象以後,咱們能夠修改相關屬性的值,那優點如何操做的呢?

  利用public void set(Object obj,Object value)方法來修改屬性

  例如:

        Student u =new Student();

       Filed ageField=u.getClass().getDeclaredField("age");

       ageField.setAccessible(true);

       ageField.set(u,new Integer(18));

    須要注意的是,這裏咱們使用了getDeclaredField方法,由於此處的age是做爲一個私有的屬性的,而getField只能訪問公開的屬性,而對於私有的屬性通常狀況下是沒法讀取、修改的,而經過反射確能夠修改,只須要增長 

      ageField.setAccessible(true)

        代碼便可。

2、利用反射調用對象的方法

    利用反射調用方法,首先咱們須要獲取到被調用的方法所對應的Method對象,而後利用Method對象調用invoke方法。invoke方法簽名以下:

    public Object invoke(Object obj,Object[] args)

    在這個方法中有兩個參數,參數1 obj表示對那個對象調用方法,參數2 args表示調用方法時候的參數列表,invoke方法返回值對應於Method對象所表明的方法調用時候的返回值。

   例如:

         Student stu=new Student();

        Method m=stu.getClass().getDeclaredMethod("study",new Class[]{int.class,double.class});

        Object result=m.invoke(stu,new Object[]{new Integer(10),new Double(1.5)});

      上面就是利用反射調用方法。與Field對象相似,也能夠調用一個類的私有方法,只須要在調用Method方法以前,先調用setAccessible(true)便可。


 反射的優點:

      其實總結來講,反射的優點在於更多的複用代碼,這也是爲何工具和框架編寫時候經常使用反射的緣由,下面一個例子大體能夠窺見端倪

      原:

          Student s =new Student();

          s.study();

    反射:

       String className = "Student";

       Class c = Class.forName(className);

       Object o = c.newInstance(); 

       String methodName = "study"; 

       Method m = c.getMethod(methodName , new Class[]{}); 

        m.invoke(o , new Object[]{}); 

  

固然,這裏並非鼓勵你們濫用反射。反射技術有着很是顯著的幾個缺點。

  1. 運行效率與不用反射的代碼相比會有明顯降低。

   2. 代碼的複雜度大幅提高,這個從量上家就能比較出來

  3. 代碼會變得脆弱,不易調試。使用反射咱們就在必定程度上繞開了編譯器的語法代碼會變得脆弱,不易調試。 使用反射咱們就在必定程度上繞開了編譯器的語法檢查,例如用反射去調一個對象的方法而該對象沒有這個方法那麼在編譯時,編譯器是沒法發現的,只能到運行時由 JVM 拋出異常。

相關文章
相關標籤/搜索