1. 程式人生 > >java筆記6-反射與泛型

java筆記6-反射與泛型

反射

Class類


class本身是一種資料型別(Type),class/interface的資料型別是Class,JVM為每個載入的class建立唯一的Class例項。
Class例項包含該class的所有資訊,通過Class例項獲取class資訊的方法稱為反射(Reflection)
獲取一個class的Class例項:

  • Class cls = String.class;

  • Class cls = "str".getClass(); 
  • Class cls = Class.forName("java.lang.String");

注意Class的==比較和instanceof的區別。
從Class例項獲取class資訊:

  • getName()
  • getSimpleName()
  • getPackage()

從Class例項判斷class型別

  • isInterface()
  • isEnum()
  • isArray()
  • isPrimitive()

建立class例項:
cls.newInstance()
JVM總是動態載入class,可以在執行期根據條件控制載入class。

 

訪問欄位


Field
通過Class例項獲取欄位field資訊:

  • getField(name):獲取某個public的field(包括父類)
  • getDeclaredField(name):獲取當前類的某個field(不包括父類)
  • getFields():獲取所有public的field(包括父類)
  • getDeclaredFields():獲取當前類的所有field(不包括父類)

Field物件包含一個field的所有資訊:

  • getName()
  • getType()
  • getModifiers()

獲取和設定field的值:

  • get(Object obj)
  • set(Object, Object)

通過反射訪問Field需要通過SecurityManager設定的規則。
通過設定setAccessible(true)來訪問非public欄位。

 

呼叫方法


Method
通過Class例項獲取方法Method資訊:

  • getMethod(name, Class...):獲取某個public的method(包括父類)
  • getDeclaredMethod(name, Class...):獲取當前類的某個method(不包括父類)
  • getMethods():獲取所有public的method(包括父類)
  • getDeclaredMethods():獲取當前類的所有method(不包括父類)

Method物件包含一個method的所有資訊:

  • getName()
  • getReturnType()
  • getParameterTypes()
  • getModifiers()

呼叫Method:

  • Object invoke(Object obj, Object... args)

通過設定setAccessible(true)來訪問非public方法。
反射呼叫Method也遵守多型的規則。

 

呼叫構造方法


Constructor
呼叫public無引數構造方法:

  • Class.newInstance()

通過Class例項獲取Constructor資訊:

  • getConstructor(Class...):獲取某個public的Constructor
  • getDeclaredConstructor(Class...):獲取某個Constructor
  • getConstructors():獲取所有public的Constructor
  • getDeclaredConstructors():獲取所有Constructor

通過Constructor例項可以建立一個例項物件:

  • newInstance(Object… parameters)

通過設定setAccessible(true)來訪問非public構造方法。

 

獲取繼承關係


繼承關係
獲取父類的Class:

  • Class getSuperclass()
  • Object的父類是null
  • interface的父類是null

獲取當前類直接實現的interface:

  • Class[] getInterfaces()
  • 不包括間接實現的interface
  • 沒有interface的class返回空陣列
  • interface返回繼承的interface

判斷一個向上轉型是否成立:

  • bool isAssignableFrom(Class)