Делая строку действительно неизменной
У меня есть вопрос, но чтобы получить ответ , сначала нужно принять следующий факт: в некоторых случаях строки 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
тем не мение. Если нет, то я бы не стал беспокоиться. Если люди так отчаянно хотят выстрелить себе в ногу, им следует позволить.