黑马程序员技术交流社区
标题:
关于反射练习,替换字符
[打印本页]
作者:
Rancho_Gump
时间:
2012-12-25 18:53
标题:
关于反射练习,替换字符
本帖最后由 张向辉 于 2012-12-27 18:01 编辑
看完张老师的视频后,实现对一个类的成员变量进行修改,我自己练习时却没成功,不知道怎么回事,请高手指导!
package cn.com;
import java.lang.reflect.Field;
public class ReflectDemo {
/**
* @param args
*/
public static void main(String[] args)throws Exception {
// TODO Auto-generated method stub
ReflectDemo2 rd2 = new ReflectDemo2("private","break","exception");
replace(rd2);
System.out.println(rd2);
}
private static void replace(Object obj)throws Exception {
// TODO Auto-generated method stub
Field[] fields = obj.getClass().getFields();
for(Field field : fields)
{
if(field.getType()== String.class)
{
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('a','b');
field.set(obj, newValue);
}
}
System.out.println(obj.toString());
}
}
class ReflectDemo2
{
String str1,str2,str3;
int a =1;
public ReflectDemo2(String str1, String str2, String str3) {
super();
this.str1 = str1;
this.str2 = str2;
this.str3 = str3;
}
@Override
public String toString() {
return "ReflectDemo2 [str1=" + str1 + ", str2=" + str2 + ", str3="
+ str3 + "]";
}
}
作者:
Rancho_Gump
时间:
2012-12-27 12:09
没人知道怎么回事啊?
作者:
清水
时间:
2012-12-27 12:25
public String str1;
public String str2;
public String str3;
写成这样才可以。
如果换成private就不行,不加修饰符也不行。
作者:
陈泽鑫
时间:
2012-12-27 16:16
本帖最后由 陈泽鑫 于 2012-12-27 16:20 编辑
两种方法
第一种:将变量公有public修饰
第二种:暴力反射,因为没有public修饰的被认为没有声明的字段
private static void replace(Object obj)throws Exception {
Class clazz = obj.getClass();
Field[] fields = clazz.getDeclaredFields();
for(Field field : fields){
field.setAccessible(true);
if(field.getType() == String.class){
String oldValue = (String)field.get(obj);
String newValue = oldValue.replace('a','b');
field.set(obj, newValue);
}
}
System.out.println(obj.toString());
}
作者:
黄锦成
时间:
2012-12-27 17:52
Field[] fields = obj.getClass().getDeclaredFields();
将getFields改为getDeclaredFields,
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2