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