黑马程序员技术交流社区

标题: 反射之强行破解private权限问题 [打印本页]

作者: qq372854822    时间: 2017-3-1 22:47
标题: 反射之强行破解private权限问题
package com.syj.util.reflect;  
  
import java.lang.reflect.Method;  
  
/**
* <p>
* Title: 私有方法调用工具类
* </p>
*  
* <p>
* Description:利用java反射调用类的的私有方法
* </p>
*  
* <p>
* Copyright: Copyright (c) 2007
* </p>
*  
* @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");  
    }  
}  

作者: programmer_1    时间: 2017-3-1 22:49
搞不懂啊。。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2