黑马程序员技术交流社区
标题:
【已解决】关于反射中Field类的问题
[打印本页]
作者:
何拴绪
时间:
2012-6-13 07:06
标题:
【已解决】关于反射中Field类的问题
本帖最后由 何拴绪 于 2012-6-13 13:41 编辑
想利用反射修改成员变量中的字符串中的字符,结果打印的还是原字符串,就各位帮忙看看这代码哪里有错:
import java.lang.reflect.Field;
public class ReflectDemo {
String str1 = "reflect";
String str2 = "reflectdemo";
public static void main(String[] args) throws Exception {
ReflectDemo rd = new ReflectDemo();
changeValue(rd);
}
private static void changeValue(Object obj) throws Exception {
Field[] fields = obj.getClass().getFields();
for (Field field : fields) {
if (field.getType() == String.class) {// 字节码使用== 使用的是一份字节码
String oldValue = (String) field.get(obj);
String newValue = oldValue.replace('r', 'R');
field.set(obj, newValue);
}
}
System.out.println(obj);
}
// 重写toString方法
public String toString() {
return str1 + " " + str2;
}
}
复制代码
作者:
马东华
时间:
2012-6-13 07:20
getFileds()返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
你要想改变,可以将str1,str设置为public
作者:
一生一世
时间:
2012-6-13 07:34
兄弟,你这么搞有点问题,首先你可以先用debug,用一下你就知道了,for循序按里面的代码根本就没有被执行,然后你就可以找问题了问什么没有被执行了,你可以打印一下System.out.println(fields.length);很明显嘛结果为0;说明根本就没有得到变量,为什么没有得到变量呢?要么就是类中没有变量,要么就是类中的变量时非public的。所以就可以找到答案了,楼上的同学给出了你一种解决办法,但是还可以有另一种办法就是暴力破解,就是张老师视频中所说的
作者:
一生一世
时间:
2012-6-13 07:37
Field[] fields = obj.getClass().getDeclaredFields();
field.setAccessible(true);
这样就可以冲根本上解决问题了,不管是什么权限的变量都可以拿到了
作者:
一生一世
时间:
2012-6-13 07:37
兄弟,认真看看视频就学会很很多东西,加油呀!!
作者:
武剑峰
时间:
2012-6-13 08:55
String str1 = "reflect";
String str2 = "reflectdemo";
必须申明为public ,默认时为protected受保护,值无法改变啊
作者:
何拴绪
时间:
2012-6-13 13:41
谢谢各位回答,疏忽了String的修饰符。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2