反射对属性操作的综合案例

来源:互联网 发布:国际 社会统计 数据库 编辑:程序博客网 时间:2024/06/05 21:50

利用反射机制,把一个对象中的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方法


老婆要求加的链接>>

原创粉丝点击