Недавно я обнаружил, что использование strtolower()
может вызвать проблемы, когда данные усекаются после специального символа.
Решение заключалось в использовании
mb_strtolower($string, 'UTF-8');
mb_ использует MultiByte. Он поддерживает больше символов, но в целом немного медленнее.
blockquote>
Они позже установлены нативными методами 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));
Это делается для предотвращения «взлома». Эти поля могут быть изменены только соответствующими сеттерами, которые вызывают методы native
private static native void setIn0(InputStream in);
private static native void setOut0(PrintStream out);
private static native void setErr0(PrintStream err);
. Нативные методы могут делать все, включая изменение конечных полей.
final
необязательно постоянны. Их все еще можно манипулировать, просто манипуляция только предотвращается во время компиляции, в частности, путем предотвращения использования оператора присваивания (=
). См. этот вопрос и JLS §17.5.3 , в частности:
blockquote>
final
поля могут быть изменены посредством отражения и других зависимых от реализации означает.Это необходимо для таких вещей, как десериализация. Это также может вызвать некоторые интересные оговорки, поскольку компиляторы могут оптимизировать поля
final
во время компиляции и времени выполнения. Примером этого является JLS, связанный выше.