三、反射 Field 相关方法
1、反射 Field 字段
反射某字段 :
/** * 反射类中的某个字段 * * @param name 要反射的字段名称 * @return */ public Reflector field(String name) { mField = findField(name); mField.setAccessible(true); return this; } /** * 查找字段名称 * 首先在本类中查找 * 如果找到直接返回字段 * 如果在本类中没有找到 , 就去遍历它的父类 , 尝试在父类中查找该字段 * 如果有父类 , 则在父类中查找 * 如果在父类中找到 , 返回该字段 * 如果在父类中没有找到 , 则返回空 * 如果没有父类 , 返回空 * * 尽量传具体的正确的类 , 不要传子类 * @param fieldName * @return */ private Field findField(String fieldName) { try { // 首先在本类中查找 , 如果找到直接返回字段 return mClass.getDeclaredField(fieldName); } catch (NoSuchFieldException e) { // 如果在本类中没有找到 , 就去遍历它的父类 , 尝试在父类中查找该字段 for (Class<?> clazz = mClass; clazz != null; clazz = clazz.getSuperclass()) { try { // 如果在父类中找到 , 返回该字段 return clazz.getDeclaredField(fieldName); } catch (NoSuchFieldException ex) { // 如果在父类中没有找到 , 则返回空 return null; } } // 如果没有父类, 则返回空 return null; } }
2、反射获取 Field 对应实例
/** * 获取 mCaller 对象中的 mField 属性值 * * @return */ public Object get() { try { return mField.get(mCaller); } catch (IllegalAccessException e) { e.printStackTrace(); return null; } }
3、反射设置 Field 对应实例
/** * 设置 mCaller 对象中的 mField 属性值 * * @param value * @return 链式调用 , 返回 Reflector */ public Reflector set(Object value) { try { mField.set(mCaller, value); } catch (IllegalAccessException e) { e.printStackTrace(); } return this; }