На другие пункты уже дан ответ, но вы все еще ищете объяснение той цитате, которую вы нашли:
, если строка изменяемая, запрос на загрузку java.io.Writer"мог быть изменен для загрузки" mil.vogoon.DiskErasingWriter "
Для справки, это, кажется, из другого SO-ответа, который является несколько коротким и не учитывает детали.
В общем, если вы пишете открытый класс, который принимает изменяемые объекты и сохраняет их или возвращает изменяемый объект, который он хранит, вызывающий код может изменить этот объект из-под ног этого класса.
Дляпример.Отказ от ответственности: я не знаю много о ClassLoader, так что это просто для иллюстрации проблемы.ClassLoader имеет функцию loadClass(String name)
.Представьте, что метод сначала проверяет, является ли класс с таким именем допустимым или доверенным, а затем загружает его.Теперь, если String был изменяемым, вызывающий код мог изменить имя класса из-под ног загрузчика классов после того, как он уже проверил класс, и, таким образом, обойти меры безопасности.
Конечно, если String был изменяемым, можно было бынадеюсь, что реализация ClassLoader сначала создаст защитную копию строки.Таким образом, вызывающий код не имеет возможности обойти защиту, поскольку у него нет возможности изменить содержимое copy .Это общее правило: не позволяйте вызывающему коду иметь какой-либо дескриптор изменяемых внутренних данных вашего класса.
Так что String не должен быть неизменяемым для обеспечения безопасной загрузки класса.Однако с неизменяемыми объектами легче обеспечить безопасность такого рода, поскольку их просто нельзя изменить из-под вас.