四、反射 Method 相关方法
1、反射 Method 方法
/** * 反射类中的某个方法 * * @param name * @param args * @return */ public Reflector method(String name, Class<?>... args) { mMethod = findMethod(name, args); mMethod.setAccessible(true); return this; } /** * 根据方法名 和 参数名称 , 查找 Method 方法 * 首先在本类中查找 * 如果找到直接返回字段 * 如果在本类中没有找到 , 就去遍历它的父类 , 尝试在父类中查找该字段 * 如果有父类 , 则在父类中查找 * 如果在父类中找到 , 返回该字段 * 如果在父类中没有找到 , 则返回空 * 如果没有父类 , 返回空 * * 尽量传具体的正确的类 , 不要传子类 * @param name * @param args * @return */ private Method findMethod(String name, Class<?>... args) { try { // 首先在本类中查找 , 如果找到直接返回方法 return mClass.getDeclaredMethod(name, args); } catch (NoSuchMethodException e) { // 如果在本类中没有找到 , 就去遍历它的父类 , 尝试在父类中查找该方法 for (Class<?> cls = mClass; cls != null; cls = cls.getSuperclass()) { try { // 如果在父类中找到 , 返回该字段 return cls.getDeclaredMethod(name); } catch (NoSuchMethodException ex) { // 如果在父类中没有找到 , 则返回空 return null; } } // 如果没有父类, 则返回空 return null; } }
2、反射调用 Method 方法
/** * 调用 mCaller 的 mMethod 方法 * * @param args * @param <T> * @return */ public <T> T call(Object... args) { try { return (T) mMethod.invoke(mCaller, args); } catch (IllegalAccessException e) { e.printStackTrace(); return null; } catch (InvocationTargetException e) { e.printStackTrace(); return null; } }