/** * 利用遞歸找一個類的指定方法,若是找不到,去父親裏面找直到最上層Object對象爲止。 * * @param clazz * 目標類 * @param methodName * 方法名 * @param classes * 方法參數類型數組 * @return 方法對象 * @throws Exception */ public static Method getMethod(Class clazz, String methodName, final Class[] classes) throws Exception { Method method = null; try { method = clazz.getDeclaredMethod(methodName, classes); } catch (NoSuchMethodException e) { try { method = clazz.getMethod(methodName, classes); } catch (NoSuchMethodException ex) { if (clazz.getSuperclass() == null) { return method; } else { method = getMethod(clazz.getSuperclass(), methodName, classes); } } } return method; } /** * * @param obj * 調整方法的對象 * @param methodName * 方法名 * @param classes * 參數類型數組 * @param objects * 參數數組 * @return 方法的返回值 */ public static Object invoke(final Object obj, final String methodName, final Class[] classes, final Object[] objects) { try { Method method = getMethod(obj.getClass(), methodName, classes); method.setAccessible(true);// 調用private方法的關鍵一句話 return method.invoke(obj, objects); } catch (Exception e) { throw new RuntimeException(e); } }
注意:參數類型名列表,必須和方法接口嚴格一致,如接口中使用的是基類類型,則類型列表中,也必須使用基類類型,而不能使用其具體類型;java
另外,對於double,也必須使用double.class,而不能使用Double.class.數組