反射機制在學習時候的總結

        java框架中的底層原理就是通過類的反射所實現的,那麼反射在學習中需要注意點什麼呢,java的類反射原理是如何在.class文件中實現的呢?

        首先我們來了解一下反射的概念Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。

        反射換個角度去理解就是對.java文件的反編譯,也就是將.class文件編譯成.java文件,主要過程如下.

       1獲取字節碼文件

在反射機制中,獲取方法有三種,現在介紹最常用的一種.

Class.forName方式

例如:

Class c = Class.forName();

        2獲取類對象.

Object obj = c.newInstance();(無參構造)

        3獲取屬性,分爲獲取所有屬性和獲取指定屬性

        獲取所有屬性屬於暴力反射過程,是將封裝好的方法拆開來進行反射機制的過程.這樣就破壞了方法的封裝意義,所以大多數是不常用的.

getDeclaredConstructor如果要使用這種暴力反射機制,可以在API幫助文檔裏Class類查看相關的用法.

常用的獲取方式就是獲取指定屬性.

        反射獲取成員變量(因爲成員變量都是私有的,所以用的很少)

Class類中方法

        Field getField(String name)   返回指定變量名的成員變量

        Field[] getFields()  返回所有public修飾的成員變量

        Field類中的方法

        void set(Object obj, Object value) 爲指定對象的成員變量賦值  obj爲要賦值的對象 value爲要賦的值

         1.獲取字節碼文件對象

         2.通過字節碼文件對象獲取字段對象

         3.調用set方法爲字段賦值注意 需要給定一個對象 可以通過快捷方式反射創建

反射獲取成員方法

     Class類中方法

      Method[] getMethods()  獲取所有公共方法

      Method getMethod(String name,Class<?>... parameterTypes)  獲取指定方法名的公共方法

      name方法名Class<?>... parameterTypes 可變參 方法需要的參數類型 如果不寫爲空參方法

     Method類中方法   

      Object invoke(Object obj, Object... args)   對帶有指定參數的指定對象調用由此Method 所表示的方法

  obj 要運行哪個對象的方法

  args 方法的實際參數

         1.獲取字節碼文件對象

         2.通過字節碼文件對象獲取方法對象

         3.調用invoke方法運行當前方法 注意 需要給定一個對象 可以通過快捷方式反射創建 

在快捷方式進行反射創建的時候要注意幾點

         這個類必須有空參構造

         空參構造必須使用public修飾

         1.獲取字節碼文件對象

         2.使用字節碼文件對象 直接創建對象

          Class類

          Object newInstance()快捷方式創建對象

用一道綜合例題進行上面內容的練習

定義一個標準的Person類,包含屬性name,包含setget方法,包含空參構造。

使用反射的方式創建一個實例、並初始化,使用反射方式調用setName方法對名稱進行設置,設置之後 在通過反射方式執行getName()方法

publicclass MainApp {

      publicstaticvoid main(String[] args) throws Exception {        

       //獲取到  Person類的字節碼文件對象

           Class clazz = Class.forName("cn.class.demo.Person");

       //根據字節碼文件對象獲取空參構造

       //根據反射獲取對象

           Object obj = clazz.newInstance();

          

          //調用setName方法對名稱進行設置

           Method method = clazz.getMethod("setName",String.class);

           method.invoke(obj,"小剛");

           //通過反射方式執行getName()方法

           Method method2 = clazz.getMethod("getName");

           System.out.println(method2.invoke(obj));

          

      }

}

 

 

 

 

 

 

發佈了56 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章