如何在运行时/启动时禁用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()来标识调用者。

+0

谢谢,好主角! – Ivarpoiss

您可以使用您的自定义安全管理器来执行此操作。如果非自动化类使用参数“setIO”调用它,即覆盖checkPermission();方法,则实现您的安全管理器将抛出AccessControlException。使用new Throwable().getStackTrace()来标识呼叫者。