如何在运行时/启动时禁用System.setOut和setErr?

时间:2011-09-12 18:29:22

标签: java logging io outputstream

如何防止其他类更改System.out?我想在App.main中设置System.out PrintStream并使其成为最终版本,因此无法再从App的其他部分进行更改。可能吗?任何hacky方式都可以:)

2 个答案:

答案 0 :(得分:4)

我快速查看代码显示可以使用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()来识别调用者。

答案 1 :(得分:0)

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