“JAVA反射機制是在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個對象,都能夠調用它的任意方法和屬性”
一、類對象的獲取
1.通過對象獲取
Object obj = new Object(); obj.getClass();
2.通過類名獲取
Object.class;
3.通過類的路徑名獲取
Class.forName("com.metadata.Student");
二、類的實例化和構造函數
獲取到的class對象可以直接通過clazz.newInstance()方法實例化,但是需要目標類有默認無參構造函數,不然會拋出異常。
在類沒有默認無參構造函數,或者需要某個具體的構造函數來實例化的情況,需要通過Constructor類的newInstance()來完成。
1.獲取公有構造函數,不包括父類
//Class
public Constructor<?>[] getConstructors() public Constructor<T> getConstructor(Class<?>... parameterTypes)
2.獲取當前類構造函數,忽略修飾符
//Class public Constructor<?>[] getDeclaredConstructors() public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
構造函數調用
//Constructor public T newInstance(Object... initargs)
//忽略修飾符,強制調用
public void setAccessible(boolean flag)
三、類成員變量的獲取
1.獲取公有變量,包括父類
//Class public Field[] getFields() public Field getField(String name)
2.獲取當前類成員變量,忽略修飾符
//Class public Field[] getDeclaredFields() public Field getDeclaredField(String name)
成員變量賦值
//Field //obj為實例對象 public void set(Object obj,Object value)
//忽略修飾符,強制調用
public void setAccessible(boolean flag)
四、類方法的獲取
1.獲取公有方法,包括父類
//Class public Method[] getMethods() public Method getMethod(String name, Class<?>... parameterTypes)
2.獲取當前類方法,忽略修飾符
//Class public Method[] getDeclaredMethods() public Method getDeclaredMethod(String name, Class<?>... parameterTypes)
方法調用
//Method //obj為類實例化對象,如果為靜態方法obj為Null invoke(Object obj, Object... args)
//忽略修飾符,強制調用
public void setAccessible(boolean flag)