1. 反射機制:在程序運行期動態獲取其類型信息的機制。
2. java.lang.Class:代表正在運行的類和接口的類型信息對象。
3. 獲取Class對象的方式:
1) 通過Object類提供的Class getClass()方法。
Integer integer = Integer.valueOF(12);
Class clazz = integer.getClass();
2) 通過Class類提供的靜態方法forName(String 類名)來獲取。
Class clazz = Class.forName("java.lang.Integer");
3) 通過類的靜態屬性class也可以獲取: Class clazz = Integer.class;
4. 通過反射獲取某個類型的屬性、方法、構造方法,父類和實現的接口。
1) 獲取類或接口的屬性信息:用java.lang.reflect.Field代表。
public Field[] getFields(); 返回一個包含公有字段對應的Field對象數組
public Field getField(String name) throws NoSuchFieldException, SecurityException; 獲取指定名稱的公有字段對應的Field對象
public Field[] getDeclaredFields() throws SecurityException 返回一個包含的所有字段對應的Field對象數組
public Field getDeclaredField(String name) throws NoSuchFieldException, SecurityException;
2) 獲取類或接口的方法:用java.lang.reflect.Method代表。
public Method[] getMethods() throws SecurityException; 返回一個包含公有 Method對象的數組
public Method getMethod(String name, Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
返回指定方法名和指定參數信息的Method對象。
3) 獲取類的構造方法:用java.lang.reflect.Constructor代表。
public Constructor<?>[] getConstructors() throws SecurityException
public Constructor<T> getConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException
4) 獲取方法的參數類型和返回值類型:調用Method類提供的對應方法。
public Class<?>[] getParameterTypes(); 按照聲明順序返回 Class 對象的數組
public Class<?> getReturnType();
5. 通過反射來創建該類型的對象:通過Class提供的newInstance()方法調用默認的構造方法來創建該類型的一個對象。
Object obj = Class.forName("java.util.Date").newInstance();
6. 通過反射訪問某個對象的屬性或方法:
Field field = clazz.getDeclaredField("屬性名"); //訪問屬性
field.setAccessible(true); //取消Java語言訪問檢查
Object obj = field.get(該類型的某個對象); //獲取指定對象上該屬性的值
field.set(該類型的某個對象, Object 值); //將指定對象變量上此 Field對象表示的字段設置爲指定的新值。
Method method = clazz.getDeclaredMethod("方法名", 參數類型信息); //訪問指定方法
method.setAssessible(true); //取消Java語言訪問檢查
Object obj = method.invoke(Object 該類型的某個對象, Object... 實參列表); //對帶有指定參數的指定對象調用由此 Method對象表示的底層方法
7. 通過反射調用帶參的構造方法比較麻煩。很多應用到反射技術的高級框架都要求你的類提供一個不帶參數的構造方法。
大多數的高級框架的核心技術都是:XML做配置,並解析,然後用反射來創建對象。