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)