反射调用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访问权限这块的原理,之后给出原因和解释!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值