A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


package com.syj.util.reflect;

import java.lang.reflect.Method;

/**
*

* Title: 私有方法调用工具类
*

*
*

* Description:利用java反射调用类的的私有方法
*

*
*

* Copyright: Copyright (c) 2007
*

*
* @author 孙钰佳
* @main sunyujia@yahoo.cn
* @date Jun 1, 2008 10:18:58 PM
*/
public class PrivateUtil {
        /**
         * 利用递归找一个类的指定方法,如果找不到,去父亲里面找直到最上层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);
                }
        }

        public static Object invoke(final Object obj, final String methodName,
                        final Class[] classes) {
                return invoke(obj, methodName, classes, new Object[] {});
        }

        public static Object invoke(final Object obj, final String methodName) {
                return invoke(obj, methodName, new Class[] {}, new Object[] {});
        }

        /**
         * 测试反射调用
         *
         * @param args
         */
        public static void main(String[] args) {
                PrivateUtil.invoke(new B(), "printlnA", new Class[] { String.class },
                                new Object[] { "test" });
                PrivateUtil.invoke(new B(), "printlnB");
        }
}

class A {
        private void printlnA(String s) {
                System.out.println(s);
        }
}

class B extends A {
        private void printlnB() {
                System.out.println("b");
        }
}
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

2 个回复

正序浏览
各位新老司机好,老司机带带我
来自宇宙超级黑马专属苹果客户端来自宇宙超级黑马专属苹果客户端
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马