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的时候才是真正传入实参。