天天看點

java中的反射(基本知識點)

一個類或者對象通過反射可以獲得自身的對象,該對象是一個java.lang.Class 的對象(就像一個鏡像檔案)。

 一個對象或者類獲得自身的Class對象的過程稱為反射。有三種方法可以獲得自身的Class對象引用(對每一個被裝載的類型(類或接口),虛拟機都會為它建立一個java.lang.Class的執行個體):

      1) Class c = Class.forName(“com.briup.ch06.Student”); //虛拟機中沒有該類的Class的執行個體對象

      2) Class c = stu.getClass()        //虛拟機已經存在Class的執行個體對象

          Class c = this.getClass(); //虛拟機已經存在Class的執行個體對象

      3) Class c = Student.class;       //通過類名.class

      注意:類和它所建立的所有對象通過反射獲得的Class對象都是同一個,在這個例子中是com.briup.ch06.Student

  反射可以讓我們利用這個Class對象來擷取和修改私有的變量和方法,不通過共有的方法去獲得,可以破壞資料的封裝性。

            反射:

            1) 确定一個對象的class,鏡像也是一個對象,屬于java.lang.Class

            2) 可以獲得一個類的修飾符、字段、方法、構造器和父類。

            3) 獲得接口聲明的常量和方法。

            4) 建立Class的執行個體,直到運作時才獲得。

            5) 運作前即使字段名字不知道,可以到程式運作時獲得和修改這些字段的值。

            6) 運作前即使對象的方法名不知道,可以到程式運作時觸發調用該方法。

            7) 運作前建立了一個大小和元素都未知的新數組,可以到運作時修改數組的元素。

 反射的重要方法調用

Class.forName(String className)

  通過全類目擷取鏡像對象

newInstance() 

 調用類中的無參構造器,建立執行個體

getField(String name)

 擷取類中目前可見的屬性

getDeclaredField(String name)

 擷取類中聲明的所有的屬性

getMethod(String name,Class... para)

 擷取類中目前可見的方法

getDeclaredMethod(String name,Class... para)

 擷取類中聲明的所有的方法

getConstructor(Class... para)

 擷取類中聲明的可見構造方法

getDeclaredConstructor(Class... para)

 擷取類中聲明的任何構造方法

    java.lang.reflect.Field

  get(Object obj)

  set(Object obj,Object value)

    java.lang.reflect.Method

  invoke(Object obj,Object... value)

    java.lang.reflect.Constructor

  newInstance(Object... value)

反射優缺點:      

      反射機制通過在運作時探查字段和方法,進而可以幫助寫出通用性很好的程式,這項能力對系統程式設計來說特别有用,但它并不适合于應用程式設計。而且,反射是脆弱的——編譯不能幫助你發現編譯錯誤,任何錯誤在運作時被發現并且都會導緻異常。