Как отключить System.setOut и setErr во время выполнения / запуска? - PullRequest
3 голосов
/ 12 сентября 2011

Как запретить другим классам изменять System.out? Я хотел бы установить System.out PrintStream в App.main и сделать его окончательным, чтобы его нельзя было изменить в других частях приложения. Является ли это возможным? Подойдет любой хакерский способ:)

Ответы [ 2 ]

4 голосов
/ 12 сентября 2011

Я быстро смотрю на код, показывающий, что 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 голосов
/ 12 сентября 2011

Вы можете сделать это, используя свой собственный менеджер безопасности. Реализуйте свой менеджер безопасности, который будет генерировать AccessControlException, если неавторизованный класс вызывает его с параметром "setIO", то есть переопределяет метод checkPermission();. Используйте new Throwable().getStackTrace() для идентификации абонента.

...