反射调用private方法的权限赋予

在做反射调用的时候通常会遇到调用private方法的权限问题,即便可以拿到private方法的Method对象,但是有的时候调用

method.setAccessible(true);

后,任然不可以访问这个私有方法,现在还没搞清楚到底是怎么回事儿。不过可以暂时这样处理,下面的类继承自java.security.PrivilegedAction接口,这个接口的作用是启用特权的情况下要执行的计算。通过这个类的run方法执行

method.setAccessible(true);

 

    /**
     * 对private和protected方法增加调用权限
     * MethodAccessibilityCallback
     * @author 老付
     *
     */
    private class MethodAccessibilityCallback implements PrivilegedAction<Object> {
        private final Method method;
        public MethodAccessibilityCallback(Method method) {
            this.method = method;
        }
        @Override
        public Object run() {
            method.setAccessible(true);
            return Void.class;
        }
    }

 这个时候私有方法通过反射到用一定是可以的!还要额外价格判断,如下面代码

 

if (!method.isAccessible()) {
            doPrivileged(new MethodAccessibilityCallback(method));
        }

 赋予private方法的执行权限。这样就ok了!发出这篇文章感觉不是很严谨,因为还没找出问什么有的时候直接method.setAccessible(true)是可以的,有的时候又不行(我写了一个简单的测试类可以,但是在我们的线上应用中似乎不行),还要继续研究,尤其是java访问权限这块的原理,之后给出原因和解释!

你可能感兴趣的:(Security)