如何在运行时/启动时禁用System.setOut和setErr?
问题描述:
如何防止其他类改变System.out?我想在App.main中设置System.out PrintStream,并使其成为最终的,所以它不能再从App的其他部分进行更改。可能吗?任何hacky的方式会做:)如何在运行时/启动时禁用System.setOut和setErr?
答
我快速看看代码显示SecurityManager可以用来防止更改。 ;)
public static void setErr(PrintStream err) {
checkIO();
setErr0(err);
}
private static void checkIO() {
SecurityManager sm = getSecurityManager();
if (sm != null) {
sm.checkPermission(new RuntimePermission("setIO"));
}
}
您可以使用Thread.currentThread()。getStackTrace()来标识调用者。
答
您可以使用您的自定义安全管理器来执行此操作。如果非自动化类使用参数“setIO”调用它,即覆盖checkPermission();
方法,则实现您的安全管理器将抛出AccessControlException。使用new Throwable().getStackTrace()
来标识呼叫者。
谢谢,好主角! – Ivarpoiss