Делая строку действительно неизменной

У меня есть вопрос, но чтобы получить ответ , сначала нужно принять следующий факт: в некоторых случаях строки Java могут быть изменены.

Это было продемонстрировано в статье Artima под названием: "Привет!".Equals("ура!") == правда

Ссылка: http://www.artima.com/weblogs/viewpost.jsp?thread=4864

Он по-прежнему хорошо работает в Java 1.6 и, безусловно, противоречит распространенному мнению о том, что повторение "Строки Java всегда неизменны".

Поэтому мой вопрос прост: всегда ли можно изменить строку таким образом, и есть ли какие-либо параметры безопасности JVM, которые можно включить, чтобы предотвратить это?

2 ответа

Решение

Вам необходимо добавить SecurityManager. На этом сайте есть пример и объяснение:

Бежать с:

java -Djava.security.manager UseReflection

И код:

import java.lang.reflect.Field;
import java.security.Permission;

public class UseReflection {
    static{
        try {
            System.setSecurityManager(new MySecurityManager());
        } catch (SecurityException se) {
            System.out.println("SecurityManager already set!");
        }

    }
    public static void main(String args[]) {
        Object prey = new Prey();
        try {
            Field pf = prey.getClass().getDeclaredField("privateString");
            pf.setAccessible(true);
            pf.set(prey, "Aminur test");
            System.out.println(pf.get(prey));
        } catch (Exception e) {
            System.err.println("Caught exception " + e.toString());
        }

    }
}

class Prey {
    private String privateString = "privateValue";
}

class MySecurityManager extends SecurityManager {
     public void checkPermission(Permission perm) {
         if(perm.getName().equals("suppressAccessChecks")){
             throw new SecurityException("Can not change the permission dude.!");
         }

     }
}

Все операции отражения подлежат проверке SecurityManager Вы установили.

И если вы беспокоитесь о вредоносном коде, вы должны иметь SecurityManager тем не мение. Если нет, то я бы не стал беспокоиться. Если люди так отчаянно хотят выстрелить себе в ногу, им следует позволить.

Другие вопросы по тегам