Как Java присваивает значение окончательному объекту System.out? [Дубликат]

Недавно я обнаружил, что использование strtolower() может вызвать проблемы, когда данные усекаются после специального символа.

Решение заключалось в использовании

mb_strtolower($string, 'UTF-8');

mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.

12
задан PrashanD 16 June 2013 в 09:43
поделиться

3 ответа

Они позже установлены нативными методами SetIn0, SetOut0 и SetErr0

private static native void setIn0(InputStream in);
private static native void setOut0(PrintStream out);
private static native void setErr0(PrintStream err);

, вызванными из метода initializeSystemClass, который согласно JavaDoc - , вызываемый после инициализации потока .

FileInputStream fdIn = new FileInputStream(FileDescriptor.in);
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
FileOutputStream fdErr = new FileOutputStream(FileDescriptor.err);
setIn0(new BufferedInputStream(fdIn));
setOut0(new PrintStream(new BufferedOutputStream(fdOut, 128), true));
setErr0(new PrintStream(new BufferedOutputStream(fdErr, 128), true));
6
ответ дан Adam Siemion 31 August 2018 в 16:09
поделиться

Это делается для предотвращения «взлома». Эти поля могут быть изменены только соответствующими сеттерами, которые вызывают методы native

private static native void setIn0(InputStream in);
private static native void setOut0(PrintStream out);
private static native void setErr0(PrintStream err);

. Нативные методы могут делать все, включая изменение конечных полей.

8
ответ дан AlexR 31 August 2018 в 16:09
поделиться
Поля

final необязательно постоянны. Их все еще можно манипулировать, просто манипуляция только предотвращается во время компиляции, в частности, путем предотвращения использования оператора присваивания (=). См. этот вопрос и JLS §17.5.3 , в частности:

final поля могут быть изменены посредством отражения и других зависимых от реализации означает.

Это необходимо для таких вещей, как десериализация. Это также может вызвать некоторые интересные оговорки, поскольку компиляторы могут оптимизировать поля final во время компиляции и времени выполнения. Примером этого является JLS, связанный выше.

1
ответ дан Community 31 August 2018 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: