程式碼試圖透過反射修改 String 的 value (char[]) 與 count (int) 字段,執行期拋出 NoSuchFieldException: count。
| JDK 版本 | String 內部結構 | 備註 |
|---|---|---|
| JDK 6/7 | char[] value; int offset; int count; | 支援 substring 共享陣列 |
| JDK 8~12 | char[] value; (無 offset/count) | substring 複製陣列,簡化結構 |
| JDK 9+ (Compact Strings) | byte[] value; byte coder; | Latin-1 用 1 byte,UTF-16 用 2 byte |
結論:count 字段在 JDK 7 後已移除,JDK 9 更換為 byte[] + coder。反射代碼強綁定舊版結構,故失敗。
String s = "hello";
Field f = String.class.getDeclaredField("value");
f.setAccessible(true);
char[] arr = (char[]) f.get(s);
arr[0] = 'H'; // 修改常量池中的 "hello" 變 "Hello"!
System.out.println("hello"); // 可能輸出 "Hello" (嚴重破壞 JVM 假設)
此行為屬於 Undefined Behavior,JVM 不保證結果,可能導致類載入錯誤、安全檢查繞過、JIT 優化失效。
StringBuilder / StringBuffer。s = "H" + s.substring(1);。count 字段不存在於現代 JDK。String 設計為不可變,反射強改屬危險行為,請勿模仿。