什么是反射機制
反射機制可以幫助我們在動態(tài)運行的時候,可以獲得其所有的方法(包括 public protected private 默認狀態(tài)的),所有的變量 (包括 public protected private 默認狀態(tài)的)。
獲取構(gòu)造方法(Constructor,Declared)
- getConstructor(Class<?>… parameterTypes):獲取指定的構(gòu)造方法,只能獲取到public權(quán)限的構(gòu)造方法
- getConstructors(Class<?>… parameterTypes):獲取所有的構(gòu)造方法,只能獲取到public權(quán)限的構(gòu)造方法
- getDeclaredConstructor:獲取指定的構(gòu)造方法,包括public、private、protected、默認權(quán)限
- getDeclaredConstructors:獲取所有的構(gòu)造方法,包括public、private、protected、默認權(quán)限
方法參數(shù):Class<?>… parameterTypes代表的是方法參數(shù)的類型,至于為什么是 … 數(shù)組類型的,因為我們參數(shù)可能是一個也可能是多個的。
ps.其它方法命名與之類似,不再闡述
logConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter");
//獲取所有構(gòu)造方法
public void logConstructor(String className) {
try {
Class<?> aClass = Class.forName(className);
Log.d("Constructor", "aClass: " + aClass);
//獲取所有的public權(quán)限構(gòu)造方法
Constructor<?>[] constructors = aClass.getConstructors();
Log.d("Constructor", "getConstructors: " + Arrays.toString(constructors));
//獲取所有的構(gòu)造方法,包括public,private,protected,默認權(quán)限的
Constructor<?>[] declaredConstructors = aClass.getDeclaredConstructors();
Log.d("Constructor", "getDeclaredConstructors: " + Arrays.toString(declaredConstructors));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
getConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter", LineAdapter.OnItemClickListener.class);
//獲取指定的構(gòu)造方法
public void getConstructor(String className, Class<?>... cl) {
try {
Class<?> aClass = Class.forName(className);
Log.d("Constructor", "aClass: " + aClass);
//獲取指定的public權(quán)限構(gòu)造函數(shù)
Constructor<?> constructor = aClass.getConstructor(cl);
Log.d("Constructor", "getConstructor: " + constructor);
//獲取指定的構(gòu)造函數(shù),包括public,private,protected,默認權(quán)限的
Constructor<?> declaredConstructor = aClass.getDeclaredConstructor(cl);
declaredConstructor.setAccessible(true);
Log.d("Constructor", "getDeclaredConstructor: " + declaredConstructor);
} catch (ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace();
}
}
注意事項
如果該方法,或者該變量不是 public 訪問權(quán)限的,我們應(yīng)該調(diào)用相應(yīng)的 setAccessible(true) 方法,才能訪問得到
//if Constructor is not public,you should call this
declaredConstructor.setAccessible(true);
獲取成員變量(Field,Declared)
logConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter");
//獲取所有成員變量
public void logConstructor(String className) {
try {
Class<?> aClass = Class.forName(className);
Log.d("Constructor", "aClass: " + aClass);
Field[] fields = aClass.getFields();
Log.d("Constructor", "getConstructors: " + Arrays.toString(fields));
Field[] declaredFields = aClass.getDeclaredFields();
Log.d("Constructor", "getDeclaredConstructors: " + Arrays.toString(declaredFields));
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
getConstructor("com.breeze.diy.recyclermuster.adapter.LineAdapter", "mStrings");
//獲取指定成員變量
public void getConstructor(String className, String s) {
try {
Class<?> aClass = Class.forName(className);
Log.d("Constructor", "aClass: " + aClass);
Field field = aClass.getField(s);
Log.d("Constructor", "getConstructor: " + field);
Field declaredField = aClass.getDeclaredField(s);
Log.d("Constructor", "getDeclaredConstructor: " + declaredField);
} catch (Exception e) {
e.printStackTrace();
}
}
獲取方法(Method,Declared)
- getDeclaredMethod(String name, Class<?>... parameterTypes)
- getMethod(String name, Class<?>… parameterTypes)
方法參數(shù):name 代表的是方法的名稱、Class<?>… parameterTypes 代表的是方法參數(shù)的類型,至于為什么是 … 數(shù)組類型的,因為我們參數(shù)可能是一個也可能是多個的。
//Person 為className的類
Person person=new Person();
Method method = ReflectHelper.getMethod(CLASS_NAME,
"setCountry", String.class);
try {
// 執(zhí)行方法,結(jié)果保存在 person 中
Object o = method.invoke(person, CHINA);
// 拿到我們傳遞進取的參數(shù) country 的值 China
String country=person.country;
PrintUtils.print(country);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}