2010-12-06 3 views
2

이것은 내가 맹목적으로 실수하지 않는 것이 나의 첫 번째 질문입니다. 더 보안 관리자를 가정하지 이 일에서 저를 방해 :리플렉션을 사용하여 문자열 값을 수정할 때 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 충돌 ...

감사

+0

사용중인 JVM 버전은 무엇입니까? –

+0

JRE 버전 : 6.0_22-b04 – vemjol

답변

3

환자 알고 싶어 의사 , 의사, 이걸 할 때 아파요. (망치로 팔을 앞다 012).

의사 : 그렇게하지 마십시오.

정말로 문자열의 내용을 엉망으로 만들지 않아야합니다. 문자열은 변경되지 않도록 설계되었습니다. 지금은 감히 JVM 버그라고 말하고 있습니다. (제 박스에서는 그렇지 않습니다. 사용중인 운영체제와 JVM 버전을 알려 주시면 유용 할 것입니다.) 간단한 대답은 다음과 같습니다. 시스템의 뒤를 돌아 보려고하지 마라.

0

"1"에 대한 문자의 배열 및 기타 억류 문자열의 숫자 모양 (같은 "true", "false", "root", "class" 등)가 윈도우 JVM에서 변경할 수 없습니다. 나는. 배열 요소에 새 값을 할당 할 수 없습니다. 그러나 당신은 그 String 객체를위한 새로운 배열을 할당 할 수 있습니다. Example