zoukankan      html  css  js  c++  java
  • 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);  
            }  
        }  
    

      注意:参数类型名列表,必须和方法接口严格一致,如接口中使用的是基类类型,则类型列表中,也必须使用基类类型,而不能使用其具体类型;

                 另外,对于double,也必须使用double.class,而不能使用Double.class.

  • 相关阅读:
    Spring中这么重要的AnnotationAwareAspectJAutoProxyCreator类是干嘛的?
    Spring到底应该学哪些内容?
    如何评价《Java 并发编程艺术》这本书?
    在腾讯工作是一种怎样的体验?
    图解 HTTP 连接管理
    42 张图带你撸完 MySQL 优化
    我是如何进入腾讯的?
    《计算机网络 PDF》搞起!
    JSR
    RelationNet:学习目标间关系来增强特征以及去除NMS | CVPR 2018
  • 原文地址:https://www.cnblogs.com/rain2012qf/p/5032833.html
Copyright © 2011-2022 走看看