이것은 내가 맹목적으로 실수하지 않는 것이 나의 첫 번째 질문입니다. 더 보안 관리자를 가정하지 이 일에서 저를 방해 :리플렉션을 사용하여 문자열 값을 수정할 때 JVM이 충돌합니다.
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보다 큰 경우
참고 : 나는 반사를 통해 필드의 값을 설정하기위한 appropiate 사용 valueField.set(obj, value)
필드 방법을 사용한다고 가정하지만 난 왜 JVM 충돌 ...
감사
사용중인 JVM 버전은 무엇입니까? –
JRE 버전 : 6.0_22-b04 – vemjol