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