利用反射機制,把一個對象中的String屬性中的值包含‘a’的改爲‘v’;
定義一個VO類
package cn.yangtao.ceshi;
public class FieldDemo {
private String str1="ball";
private String str2="hall";
private String str3="helllslalllas";
// public String getStr1() {
// return str1;
// }
// public void setStr1(String str1) {
// this.str1 = str1;
// }
// public String getStr2() {
// return str2;
// }
// public void setStr2(String str2) {
// this.str2 = str2;
// }
// public String getStr3() {
// return str3;
// }
// public void setStr3(String str3) {
// this.str3 = str3;
// }
public String toString(){
return this.str1+";"+this.str2+";"+this.str3;
}
}
具體的操作類
package cn.yangtao.ceshi;
import java.lang.reflect.*;
public class ModiferField {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
FieldDemo fd=new FieldDemo();
replaceValue(fd);
System.out.println(fd);
}
private static void replaceValue(Object obj)throws Exception {
// TODO Auto-generated method stub
Class c1=obj.getClass();
Field[] fields=c1.getDeclaredFields();
for(Field field:fields){
field.setAccessible(true);
if(field.getType()==String.class){
String oldValue=(String)field.get(obj);
String newValue=oldValue.replace('a', 'v');
//System.out.println(newValue);
field.set(obj, newValue);
}
}
}
}
因爲在VO類中。我把屬性設置成私有的,所以在操作類要取得屬性時採用getDeclaredFields().然後再把每個反問權限設置爲true就可以訪問了。之前沒有注意到這個問題,而採用了getFields()方法,弄得很久都沒運行成功,希望其他人不要再犯同樣的錯誤了
另外,發現把VO類中的getter和setter方法註釋掉。程序運行的結果仍然是一樣的。說明用反射在取出類中的屬性時沒有調用setter和getter方法