黑马程序员技术交流社区
标题:
替换任意一个对象中所有String类型的成员变量
[打印本页]
作者:
傅宇
时间:
2013-3-13 15:48
标题:
替换任意一个对象中所有String类型的成员变量
import java.lang.reflect.Field;
public class ReflectTest1 {
public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
ReflectPoint rp = new ReflectPoint(3, 5);
changeStringValue(rp);
System.out.println(rp);
}
public static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {
Field[] fields = obj.getClass().getFields();
for(Field f : fields){
if(f.getType() == String.class){
String oldValue = (String)f.get(obj);
String newValue = oldValue.replace('b', 'a');
f.set(obj, newValue);
}
}
}
}
public class ReflectPoint {
private int x;
public int y;
String str1 = "banana";
String str2 = "bite";
String str3 = "ball";
String str4 = "big";
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
@Override
public String toString(){
return str1+":"+str2+":"+str3+":"+str4;
}
}
复制代码
将任意一个对象中的所有String类型的成员变量所对应的字符串内容中的"b"改成"a"。为什么没有替换成功?
作者:
黑马-郑玉元
时间:
2013-3-13 15:54
那么长的代码,还没有一行注释,看着真头疼!
作者:
许鑫星
时间:
2013-3-13 16:03
public static void changeStringValue(Object obj)
throws IllegalArgumentException, IllegalAccessException {
// 这个方法不能获得不是public的成员属性
// Field[] fields = obj.getClass().getFields();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field f : fields) {
if (f.getType() == String.class) {
String oldValue = (String) f.get(obj);
String newValue = oldValue.replace('b', 'a');
f.set(obj, newValue);
}
}
}
复制代码
你的替换方法有问题,我给你注释了,要用getDeclaredFields才能获得非public的成员
作者:
刘海浩
时间:
2013-3-13 16:14
getFields()返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。你可以在String前加public修饰。或者将getFields()改成getDeclaredFields,这样可以取到类中的所有字段。
作者:
陈丽莉
时间:
2013-3-13 22:48
若仍有问题,请继续追问;没问题的话,请将帖子的分类改成【已解决】~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2