反射對屬性操作的綜合案例

利用反射機制,把一個對象中的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方法


老婆要求加的鏈接>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章