Android中通過反射的方式調用某些方法

Android中有些系統類的方法未對外開放,然而有時卻要用到這些東西來完成自己的需求,那麼這時候就可以用反射的方法來完成。

eg1:舉一個系統類的例子。 Window類用的比較多,項目裏用到了,切換fragment,就更改標題欄的顏色,用到了給window設置顏色的方法,而又無法調用,所以就通過反射的方式。
public static void setStatusBarColorForce(Activity activity, int color) {
try {
    Window window = activity.getWindow();//拿到Window對象
    window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);//添加flag可加可不加,看自己需求而定。
    Class<?> clazz = window.getClass();//通過getclass拿到類對象。
    Method method = clazz.getDeclaredMethod("setStatusBarColorForce", int.class);//這一句是調window對象的"setStatusBarColorForce"方法。getDeclaredMethod()的參數第一個是方法名,剩下的是"setStatusBarColorForce"方法需要入的參數類型,假設是int 就傳int.class,String就傳String.class。
    method.setAccessible(true);
    method.invoke(window, color);//方法執行,傳入真正的參數。
} catch (IllegalAccessException e) {
    e.printStackTrace();
} catch (NoSuchMethodException e) {
    e.printStackTrace();
} catch (InvocationTargetException e) {
    e.printStackTrace();
}

}

eg2:再舉一個其他類的反射的例子。

Class<?> smt = Class.forName("你要反射的或者說你要用的類的包名+類名");
Method getsom = smt.getDeclaredMethod("getInstance");
Object object = getsom.invoke(smt);//通過getinstance方法實例化對象
Method getAuthor = smt.getDeclaredMethod("方法名", Context.class, int.class, int.class, String.class);//參數類型的class
getAuthor.setAccessible(true);
getAuthor.invoke(object, MainActivity.this, op_net_mobile, getApplicationInfo().uid, getPackageName());//實參。
注意,getDeclaredMethod()方法需要傳的值,是參數類型的class。當invoke的時候纔是真正傳入實參。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章