Это мой первый вопрос, я надеюсь, я не совершу ужасной ошибки.
Предполагая, что SecurityManager не мешает мне сделать это:
public static void main(String[] args) {
String str = "1";
System.out.println("str value before invoke fillStringValueWithX method: " + str);
fillStringValueWithX(str);
System.out.println("str value before invoke fillStringValueWithX method: " + str);
}
private static void fillStringValueWithX(String str) {
if (str != null) {
try {
Field fieldValue = String.class.getDeclaredField("value");
fieldValue.setAccessible(true);
char[] charValue = (char[]) fieldValue.get(str);
Arrays.fill(charValue, 'x');
fieldValue.setAccessible(false);
} catch (Exception e) {}
}
}
Если размер строки равен 1 (пример выше), сбой JVM (дамп сбоя показывает ошибку EXCEPTION_ACCESS_VIOLATION), однако, если размер строки больше 1, этот фрагмент кода работает для меня.
Примечание: Я предполагаю, что подходящее использование для установки значения поля с помощью отражения использует valueField.set(obj, value)
Метод поля, но я хочу знать, почему происходит сбой JVM ...
Спасибо