1. 程式人生 > >Java基礎之反射理論

Java基礎之反射理論

反射 :自描述或者自定義
  平時我們照鏡子的時候,在鏡子後面會有自己的影子,其實java中的反射也是類似的,一個類或者物件通過反射可以獲得自身的物件,該物件是一個java.lang.Class的物件(就像一個映象檔案)。一個物件或者類獲得自身的Class物件的過程稱為反射。java.lang.Class:是類映象,映象物件,Class類映象的作用可以獲取該類和該物件的所有屬性,方法和構造器,以及屬性方法和構造器修飾符,修改私有屬性的值。呼叫方法和呼叫構造器等等。

Class等各過程:
Class----例項化----->class-----例項化----->物件
物件------抽象化----->class------抽象化----->Class


抽象:具有相同屬性和行為抽象出來
public class Class{
    Field[] fileds;
        Method[] methods;
        Constructor[]  cons;
}
反射API:
    java.lang.Class
    java.lang.reflect.Field
    java.lang.reflect.Method
    java.lang.reflect.Array
    java.lang.reflect.Constructor
class Person{}
Person建立100個物件,建立多少個Person的Class型別物件?
class Person{}
   1個,類載入的時候建立Person的Class型別物件。

通過反射操作的步驟:
1)獲取類映象(Class物件),三種方式
   a)Class.forName(String className)
   b)資料型別.class
   c)物件.getClass()
2)通過類映象例項化物件(不通過new方式建立物件)
   Object obj=類映象物件.newInstance()。
      預設會呼叫class類的無參構造器。
3)通過例項化物件操作屬性,方法,構造器
   a)獲取所有的屬性(屬性名和修飾符和資料型別)。
   b)獲取所有的方法(方法名和修飾符和返回值和引數列表)
   c)獲取所有構造器(名字和修飾符和引數列表)
   d)修飾屬性的值
   e)呼叫方法:invoke()
   f)呼叫指定構造器建立的物件

什麼時候反射:
  1)在執行的時候才知道類名
  2)在執行的時候才知道屬性名
  3)在執行的時候才知道方法名
反射:
    1) 確定一個物件的class
    2) 可以獲得一個類的修飾符、欄位、方法、構造器和父類。
    3) 獲得介面宣告的常量和方法。
    4) 建立Class的例項,直到執行時才獲得。
    5) 執行前即使欄位名字不知道,可以到程式執行時獲得和修改這些欄位的值。
    6) 執行前即使物件的方法名不知道,可以到程式執行時觸發呼叫該方法。
    7) 執行前建立了一個大小和元素都未知的新陣列,
       可以到執行時修改陣列的元素。

反射的用途:
  1)修改私有屬性的值
  2)呼叫任何物件的任何方法
  3)不通過new方式建立物件

反射用途的注意:
  1)反射可以讓我們利用這個Class物件來獲取和修改私有的變數和方法,不通過共有的方法去獲得(原來我們例子都是通過一個public的方法來設定和獲取私有的變數),可以破壞資料的封裝性。
  2)反射機制通過在執行時探查欄位和方法,從而可以幫助寫出通用性很好的程式,這項能力對系統程式設計來說特別有用,但它並不適合於應用程式設計。而且,反射是脆弱的——編譯不能幫助你發現編譯錯誤,任何錯誤在執行時被發現並且都會導致異常。導致程式碼不安全。