Java反射机制在Android中的应用

2018-06-05  本文已影响0人  阿狸_191d

mTm = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
Field sField = mTm.getClass().getField("ACTION_PRECISE_CALL_STATE_CHANGED");
Log.d(TAG, "zly --> name: " + sField.getName() + " values:" + sField.get(MainActivity.this))

从上面可以看到这里使用了getField方法来进行获取变量的反射,这个方法只能反射public的修饰的变量,sField.get这个只能获取有值的变量,如果是Context context这种没有初始值的情况会异常报错,如果希望反射private 或者protecte的变量需要使用getDeclaredField方法,使用规则一样。getField和getDeclaredField的另外一个区别就是getDeclaredField只能获取本类里的变量,父类变量无法反射,getField则都能反射。

2. 当我们需要获取指定方法

如我们需要获取TelephonyManager的getSimState方法并且是带参数的。

Class clazz = TelephonyManager.class;
Method method = clazz.getMethod("getSimState", int.class);
Log.d(TAG, "zly --> simState:" + (int) method.invoke(mTm, 0));

从上述代码中可以看到首先在创建一个TelephonyManager的Class类,再通过这个类的getMethod得到我们需要的方法,getMethod方法参数如下:

同样这里的getMethod方法也是只能获取public修饰的方法,如果需要获取其它类型的,需要使用getDeclaredMethod,使用规则及原理同上面提到的getDeclaredField。

还有一种方法可以找到我们指定的反射变和或方法,并不推荐这种,知道就好。

private void printAllFileds() {
Field[] field = mTm.getClass().getDeclaredFields();
Field f;
for (int i = 0; i < field.length; i++) {
f = field[i];
Log.d(TAG, "zly --> Field Name = " + f.getName());
}
}

private void printAllMethods() {
Method[] method = mTm.getClass().getDeclaredMethods();
for (Method m : method) {
System.out.println("Method Name = " + m.getName());
}
}

使用总结

demo: https://github.com/zhangleyi1/PracticeReflect.git

上一篇 下一篇

猜你喜欢

热点阅读