反射修改String的內容
阿新 • • 發佈:2021-01-19
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就會編譯成功