1. 程式人生 > 其它 >反射修改String的內容

反射修改String的內容

技術標籤:反射不常用方法java

import java.lang.reflect.Field;

public class Main{
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        //反射是和封裝背道而馳的1使用反射可能打破封裝,程式碼複雜容易出錯
        //反射犧牲了編譯器自身的檢驗機制,更需要人工保證程式碼的正確性
        //通過反射方式修改String的內容
        //特殊手段不是常規手段

        String str="hello";
        //(1)獲取到String的類物件
        //(2)根據value這個欄位名字,在類物件中拿到對應欄位(仍然是圖紙的一部分,相當於區域性放大)
        Field valueField= String.class.getDeclaredField("value");
        valueField.setAccessible(true);
        //(3)根據圖紙拆開str這個物件,取出裡面的零件
        //讓value這個private的成員也能被訪問到
        char[] value =(char[])valueField.get(str);

        //(4)修改零件內容
        value[4]='a';

        System.out.println(str);
    }



}

這裡注意如果使用這個版本的jdk就會有以下報錯在這裡插入圖片描述

WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by Main (file:/E:/Mianxiangduixaing/out/production/Mianxiangduixaing/) to field java.lang.String.value
WARNING: Please consider reporting this to the maintainers of Main
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Exception in thread "main" java.lang.ClassCastException: [B cannot be cast to [C
	at Main.main(Main.java:17)

Process finished with exit code 1

使用這個版本的jdk就會編譯成功在這裡插入圖片描述
在這裡插入圖片描述