try {
Class<?> clazz = str.getClass();
Field field = clazz.getDeclaredField("value");
field.setAccessible(true);
Object obj = field.get(str);
char [] charValue = (char [] )obj;
charValue = new char [3];
for(int i=0;i<charValue.length;i++){
charValue[i]='a';
}
field.set(str, charValue);
} catch (Exception e) {
e.printStackTrace();
}
}發現能知足個人要求,。值是被改了,而後我想改變長度,因而又動一下代碼charValue = new char [4];
發現值不能改變 繼續看String源碼,發現有個count屬性,。因而又了改了這個值代碼以下
try {
Class<?> clazz = str.getClass();
Field field = clazz.getDeclaredField("value");
field.setAccessible(true);
Object obj = field.get(str);
char [] charValue = (char [] )obj;
charValue = new char [4];
for(int i=0;i<charValue.length;i++){
charValue[i]='a';
}
Field field1 = clazz.getDeclaredField("count");
field1.setAccessible(true);
field1.set(str, charValue.length);
field.set(str, charValue);
} catch (Exception e) {
e.printStackTrace();
}
}
發現能解決問題。
我又試了下
而後我又試下Integer 發現同樣能夠
代碼以下:
static void changeInteger(Integer a){ try { Class<?> clazz = a.getClass(); Field field = clazz.getDeclaredField("value"); field.setAccessible(true); field.set(a, 12312); } catch (Exception e) { e.printStackTrace(); } }
我的以爲只要Field.setAccessible(true); 以後,即便是final關鍵字標示過得屬性也能夠有訪問權限!這樣的反射會改變JAVA的結構,甚至你的代碼可維護性,你徹底能夠 改別的代碼裏面的值 ,因此這只是一個簡單的例子。只是驗證經過反射能作一些讓你沒法想象的東西。。