Делая строку действительно неизменной - PullRequest
4 голосов
/ 19 июля 2011

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

Это было продемонстрировано встатья Artima под названием: «Привет!» .equals («ура!») == true

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

В Java 1.6 все еще работаети это, безусловно, противоречит распространенному мнению, заключающемуся в повторении «Строки Java всегда неизменны» .

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

Ответы [ 2 ]

7 голосов
/ 19 июля 2011

Вам необходимо добавить 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.!");
         }

     }
}
5 голосов
/ 19 июля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...