Java阻止在类外调用私有或受保护的方法

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.我们怎么能这样做呢?我们应该从某处获取堆栈跟踪并检查它的调用位置吗?或者我们应该做别的事吗?

Phi*_*son 6

你需要一个安全经理......

https://docs.oracle.com/javase/tutorial/essential/environment/security.html

安全管理器是定义应用程序安全策略的对象.此策略指定不安全或敏感的操作.安全策略不允许的任何操作都会导致抛出SecurityException.应用程序还可以查询其安全管理器以发现允许的操作.

它支持禁止setAccessible()通过反射使私有和受保护的方法可被调用.