A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何拴绪 中级黑马   /  2012-6-13 07:06  /  1883 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何拴绪 于 2012-6-13 13:41 编辑

想利用反射修改成员变量中的字符串中的字符,结果打印的还是原字符串,就各位帮忙看看这代码哪里有错:
  1. import java.lang.reflect.Field;

  2. public class ReflectDemo {

  3.         String str1 = "reflect";
  4.         String str2 = "reflectdemo";

  5.         public static void main(String[] args) throws Exception {

  6.                 ReflectDemo rd = new ReflectDemo();
  7.                 changeValue(rd);
  8.         }

  9.         private static void changeValue(Object obj) throws Exception {
  10.                 Field[] fields = obj.getClass().getFields();
  11.                 for (Field field : fields) {
  12.                         if (field.getType() == String.class) {// 字节码使用== 使用的是一份字节码
  13.                                 String oldValue = (String) field.get(obj);
  14.                                 String newValue = oldValue.replace('r', 'R');
  15.                                 field.set(obj, newValue);
  16.                         }
  17.                 }
  18.                 System.out.println(obj);
  19.         }

  20.         // 重写toString方法
  21.         public String toString() {
  22.                 return str1 + " " + str2;
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
赵志勇 + 1

查看全部评分

6 个回复

倒序浏览
getFileds()返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段
你要想改变,可以将str1,str设置为public
回复 使用道具 举报
兄弟,你这么搞有点问题,首先你可以先用debug,用一下你就知道了,for循序按里面的代码根本就没有被执行,然后你就可以找问题了问什么没有被执行了,你可以打印一下System.out.println(fields.length);很明显嘛结果为0;说明根本就没有得到变量,为什么没有得到变量呢?要么就是类中没有变量,要么就是类中的变量时非public的。所以就可以找到答案了,楼上的同学给出了你一种解决办法,但是还可以有另一种办法就是暴力破解,就是张老师视频中所说的
回复 使用道具 举报
Field[] fields = obj.getClass().getDeclaredFields();
field.setAccessible(true);
这样就可以冲根本上解决问题了,不管是什么权限的变量都可以拿到了
回复 使用道具 举报
兄弟,认真看看视频就学会很很多东西,加油呀!!
回复 使用道具 举报
String str1 = "reflect";
String str2 = "reflectdemo";
必须申明为public ,默认时为protected受保护,值无法改变啊
回复 使用道具 举报
谢谢各位回答,疏忽了String的修饰符。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马