黑马程序员技术交流社区

标题: 通过反射获取变量。改变值,打印,高新视频 [打印本页]

作者: 余善航    时间: 2013-3-7 21:50
标题: 通过反射获取变量。改变值,打印,高新视频
//定义一个类,定义几个String 的成员变量
public class LeiDeBianLian {

        private int y;
        public int x;
        String aa="sad";
        String sd="sdadas";
        String dsa="sadasd";
        public LeiDeBianLian(int y, int x) {
                super();
                this.y = y;
                this.x = x;
        }
        @Override
        public String toString() {
                // TODO Auto-generated method stub
                return aa+" :  "+sd+" : "+dsa;
        }

}




import java.lang.reflect.Field;

public class HuoQuBianLiang {

        /**
         * @param args
         * @throws NoSuchFieldException
         * @throws SecurityException
         * @throws IllegalAccessException
         * @throws IllegalArgumentException
         */
        public static void main(String[] args) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
                // TODO Auto-generated method stub

                                LeiDeBianLian l=new LeiDeBianLian(3,56);
                                Tong(l);
                System.out.println(l);
        }
        private static void Tong(Object obj) throws IllegalArgumentException, IllegalAccessException
        {
                Field[] fields=obj.getClass().getFields();
                for(Field field : fields)
                {
                        if(field.getType()==String.class)
                        {
                                String oldStr=(String) field.get(obj);
                                String newStr=oldStr.replace('a', 'g');
                                field.set(obj, newStr);
                               
                        }
// 这个例子的String的变量值没有被改变 ,
// 可能晕了,不知道怎么弄了

作者: 夏振博    时间: 2013-3-7 22:12
本帖最后由 夏振博 于 2013-3-8 01:18 编辑

Field[] fields=obj.getClass().getFields();//getFields();是返回所有可访问公共字段,你的String都是默认的 不是public的 所以拿不到
Field[] fields = obj.getClass().getDeclaredFields();//这个方法是拿到所有的字段,当然,其中可能会有私有的需要改变下访问权限,(暴力访问)setAccessible(true);,这样可以修改
你也可以把那些String 都定义为public  这样getFields();方法可以拿到字段,这样也可以修改
作者: cyh8807    时间: 2013-3-7 23:51
  1. private static void Tong(Object obj) throws IllegalArgumentException,
  2.                         IllegalAccessException {
  3.                 Field[] fields = obj.getClass().getDeclaredFields();

  4.                 for (Field field : fields) {
  5.                         field.setAccessible(true);
  6.                         if (field.getType() == String.class) {
  7.                                 String oldStr = (String) field.get(obj);
  8.                                 String newStr = oldStr.replace('a', 'g');
  9.                                 field.set(obj, newStr);

  10.                         }
  11.                 }
  12.         }
复制代码
将你这个方法区的代码这样修改下就可以得到你想要的答案了
原因是:public Field[] getFields()  throws SecurityException    该方法返回该接口及其所有超接口的公共字段。
而你的代码成员变量是默认的,默认的就不是public
public
Field[] getDeclaredFields()   throws SecurityException该方法返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。
包括公共、保护、默认(包)访问和私有字段,但不包括继承的字段。
field.setAccessible(true); 该行代码的意思将所有字段都设置为可以访问的


作者: 夏晓彤    时间: 2013-3-8 01:09
楼上的说的都差不多了,之前我也和你犯了错同样的错误,不过,我把变量默认修饰类型当成了public,浪费了好多时间,才找到错误

你还可以把 String aa="sad";
        String sd="sdadas";
        String dsa="sadasd";
改成
public  String aa="sad";
public String sd="sdadas";
public String dsa="sadasd";
如果不改只能用暴力反射了
用getDeclaredFields()方法和setAccessible(true)方法
作者: 陈丽莉    时间: 2013-3-8 23:29
如果问题清楚了,请将帖子分类改成【已解决】。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2