Laj*_*pad 5 java reflection private
让我们假设我创建了一个名为Java的库,Foo并在该库中调用了一个类Bar.让我们进一步假设在Bar类中我有一个名为的私有方法fooBar.
public class Bar {
//...
private Object fooBar() {
//Do something
}
//...
}
Run Code Online (Sandbox Code Playgroud)
可以使用类中编写的代码毫无困难地运行此方法,如下所示:
public static Object runMethod(Object object, String methodName) {
Method method = object.getClass().getDeclaredMethod(methodName);
method.setAccessible(true);
return method.invoke(object);
}
Run Code Online (Sandbox Code Playgroud)
但是,让我们假设我们打算劝阻这种习惯fooBar.我们怎么能这样做呢?我们应该从某处获取堆栈跟踪并检查它的调用位置吗?或者我们应该做别的事吗?
你需要一个安全经理......
https://docs.oracle.com/javase/tutorial/essential/environment/security.html
安全管理器是定义应用程序安全策略的对象.此策略指定不安全或敏感的操作.安全策略不允许的任何操作都会导致抛出SecurityException.应用程序还可以查询其安全管理器以发现允许的操作.
它支持禁止setAccessible()通过反射使私有和受保护的方法可被调用.