String 대상 의 가 변 적 이지 않 은 문제 분석

2221 단어 String불가 변
String 대상 이 가 변 적 인지 아 닌 지 는 오래된 문제 입 니 다. 오늘 은 자세히 분석 해 보 겠 습 니 다.
1. String 은 immutable 가 변 적 이지 않 은 디자인 모델 을 사용 하고 String 은 final 에 의 해 수식 된다.따라서 String 클래스 도 계승 되 지 못 하고 방법 은 다시 쓸 수 없다.String 대상 도 바 꿀 수 없습니다.왜 가 변 적 이지 않 게 설계 되 었 는 지 에 대해 서 는제 가 이전에 String, StringBuilder, StringBuffer 분석 에 관 한 글 을 보 세 요. 그 안에 상세 한 설명 이 있 습 니 다.
2. 일반적으로 String 대상 은 가 변 적 이지 않 고 모두 JDK API 를 기반 으로 합 니 다.String 소스 코드 에서 String 대상 의 값 을 저장 하 는 속성 은 final 입 니 다.하지만 final 수식 의 속성 치 는 변 하지 않 습 니까?답 은 당연히 "할 수 있다".우리 가 JDK 를 돌 때, 우 리 는 반사 구역 을 통 해 final 수식 속성의 값 을 바 꿀 수 있다.다음은 어떻게 수정 하 는 지 알려 드 리 겠 습 니 다.
일단 스 트 링 의 파 트 소스 를 한번 볼 게 요.
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence
{
    /** The value is used for character storage. */
    private final char value[];
 
    /** The offset is the first index of the storage that is used. */
    private final int offset;
 
    /** The count is the number of characters in the String. */
    private final int count;
 
    /** Cache the hash code for the string */
    private int hash; // Default to 0
 
    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
 
    ......
 
}

위의 String 의 원본 코드 에서 볼 수 있 듯 이 String 의 값 은 final 에 의 해 value [] 라 는 문자 배열 에 저 장 됩 니 다.저희 가 String 상 대 를 바 꾸 려 면...
public class Test {
    public static void main(String[] args) throws Exception {
        String s="0123456789";
        System.out.println("   :s=" + s);
        Field f = s.getClass().getDeclaredField("value");//        String value Field  
        f.setAccessible(true); //             java       
        f.set(s, new char[]{'a', 'b', 'c'}); // s      abc
        System.out.println("   :s=" + s);
    }
}

인쇄 결과:
변경 전: s = 0123456789
변경 후: s = abc
결론:
String 클래스 에 privatefalchar value [] 구성원 변수 가 있 습 니 다. String 클래스 의 값 은 모두 이 value 속성 에 저 장 됩 니 다.반 사 를 통 해 이 값 을 변경 하여 String 클래스 값 을 바 꾸 는 목적 을 달성 할 수 있 습 니 다.마찬가지 로, 이러한 방식 을 통 해 우 리 는 사용자 정의 대상 의 개인 구성원 변 수 를 바 꿀 수 있다.

좋은 웹페이지 즐겨찾기