Java反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法,當然包括私有屬性和私有方法;對於任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲Java語言的反射機制。
在瞭解反射之前,我們需要對java中的Class有一個大致的瞭解:
- Class也是一個類,用來描述類本省的類。包括類的屬性field,方法method,接口和構造器constructor等屬性
- 也就是說通過一個類的對象,其實可以獲得這個類的所有信息
- 一個JVM中一個類只有一個Class實例,且該實例只由系統來創建
下面通過反射機制Class類中的一些方法和相關方法來詳細瞭解反射:
1.反射機制獲取類clazz的方法:
- className.class
- object.getClass()
- Class.forName("類的全稱")
2.通過類clazz來獲得對象:
- Object object=clazz.newInstance();//該類必須包含默認構造函數
3.類的加載器:clazz.getClassLoader()
4.獲取類的method:
- 獲取類的公有方法:Method [] methods=clazz.getMethods();
- 獲取所有方法:clazz.getDeclaredMethods();
- 獲取指定方法:使用參數的類型做爲參數,getDeclaredMethod(String name, Class<?>... parameterTypes);
method.invoke(Object obj, Object... args)
6.field字段:
- 獲取所有字段:Field [] fields=clazz.getDeclaredFields();
- 獲取指定名字的field: clazz.getDeclaredField("fieldName");
- 獲取field的名字:field.getName();
- 獲取指定對象Field的值:field.get(obj);
- 設置指定對象Field的值:field.set(obj, val);
7.構造器:
- 獲取指定類的構造器:Constructor<類> [] cons=clazz.getConstructors();
- 獲取指定構造器:clazz.getConstructos(Class<?>...parameterTypes);
- 使用構造器: constructor.newInstance(Object...object)
8.註解