欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-14 13:47:04
...

在做反射调用的时候通常会遇到调用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