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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Rancho_Gump 高级黑马   /  2012-12-25 18:53  /  1628 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 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 + "]";
}

}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

4 个回复

倒序浏览
没人知道怎么回事啊?
回复 使用道具 举报
        public String str1;
        public String str2;
        public String str3;

写成这样才可以。
如果换成private就不行,不加修饰符也不行。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 陈泽鑫 于 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());
    }
回复 使用道具 举报
Field[] fields = obj.getClass().getDeclaredFields();
将getFields改为getDeclaredFields,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马