Java中的反射,應用場景以及與new的區別

一. 反射是什麼?

      反射是在運行狀態中,對於任意一個類,都能獲取該類的所有屬性和方法;對於任意一個對象,都能調用它的任意一個方法和屬性,這種動態獲取類信息以及動態調用對象內容就稱爲Java的反射機制。

二.反射的實現

      當使用一個類,我們要先把它加載到虛擬機中,生成class文件,此時類的信息就存儲在class文件中。反射就是我們可以通過獲取這個class對象,去訪問類,對象的元數據以及運行時的數據。

       獲得class對象的方法:Class.forName(String className),className.class,對象.getClass()

三.爲什麼用反射

       反射的重點在於運行階段獲取類的信息和調用類的方法,所以當你需要“某些信息在編碼階段不清晰,需要在運行階段動態加載”,在這種場景下,可以使用反射。

四.反射的API

    1.通過反射機制創建class對象

    class1  = Class.forName(String className)

    class2  = 對象名.getClass()

    class3 = 對象名.class

       2.通過反射機制來創建一個類的對象

1.如上創建class對象

2.Classname  對象 = clssname.newInstance(參數)

       3.獲取某個屬性(包括私有)

Class<?> clazz = Class.forName(classname);

//返回一個 Field 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明字段。 包括公共、私有、保護的字段。
  Field field = clazz.getDeclaredField(字段名);

//禁用Java權限修飾符的作用,無視方法權限限制進行訪問
 field.setAccessible(true);

// void set(Object obj, Object value) 將指定對象變量上此 Field 對象表示的字段設置爲指定的新值。           
  field.set(該類的一個對象, 字段值);

        4.調用某個方法(包括私有)

Class<?> clazz = Class.forName(classname);

// Method getMethod(String name, Class<?>... parameterTypes) 

//返回一個 Method 對象,它反映此 Class 對象所表示的類或接口的指定公共成員方法。
//獲取一個公有函數
  Method method = clazz.getMethod(方法名,參數類型);
//調用具體某個實例對象的這個公有方法
  method.invoke(實例對象,參數值);

// Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
//返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。 包括私有、保護、公有方法

//獲取一個私有函數
Method private_method=class.getDeclaredMethod(函數名,參數類型);

//禁用Java權限限定符的作用,使私有函數可訪問
 private_method.setAccessible(true);

//調用具體實例對象的這個方法
 private_method.invoke(實例對象,參數);

五.反射應用場景

    1.Spring通過反射來幫我們實例化對象,並放入到Ioc容器中

     2.使用JDBC鏈接數據庫時加載數據庫驅動Class.forName()

     3.逆向代碼  例如反編譯

六.反射的優缺點

      1.優點

          運行期類型的判斷,動態類的加載,動態代理使用反射

       2.缺點

          性能是個問題,反射相當於一系列解釋,通知jvm要做的事情,性能比直接的Java程序要慢。

七.反射與new的區別

       1.new的對象無法訪問其中的私有屬性,反射出來的可以通過設置setAccessible()方法來省略訪問權限符。

       2.new必須要知道類名,而反射創建對象不需要知道類型也可以創建

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章