java 經過反射技術調用基類私用方法(可適用於任何類的私有方法調用)

/** 
     * 利用遞歸找一個類的指定方法,若是找不到,去父親裏面找直到最上層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.數組

相關文章
相關標籤/搜索