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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 夏晓彤 中级黑马   /  2013-3-4 18:32  /  1600 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 夏晓彤 于 2013-3-9 14:40 编辑

我在写将任一一个对象的所有String类型的成员变量所对应的字符串内容进行修改时出现的问题
下面是要修改成员变量的类public         class ReflectPoint{
        String s = "aabbcc";
        public String s1 ="cbcca";
        private int x;
        public int y;
        public ReflectPoint(int x, int y) {
                super();
                this.x = x;
                this.y = y;
        }
        public String toString(){
                return s+";"+s1;
                }
}
我定义了两个String类型变量
     String s = "aabbcc";
     public String s1 ="cbcca";
一个public类型的,一个默认类型的
一开始我定义的都是默认类型的
String s = "aabbcc";
String s1 ="cbcca";
后来主函数执行时,根本就不会执行替换这个动作,调试了下,发现if(field.getType()== String.class)这是false我就郁闷了,然后和张老师的代码对比了,虽然上面类的代码很少,但是用了好长时间才发现问题,因为变量默认类型是public类型的啊,张老师是这样定义的
public String s = "aabbcc";
public String s1 ="cbcca";
我把public加上,运行主函数,终于修改了,于是我把public String s = "aabbcc";的public去掉,执行主函数,s就没被修改,为什么???

6 个回复

倒序浏览
这个我也试过,貌似通过 getFields()方法只能反射到被public 修饰的字段,而没有被public修饰的字段需要通过getDeclaredFields()获取,再通过设置setAccessible(true)才能获取。
这样写就都可以获取了。
  1. public static void changeStringValue(Object obj) throws Exception{
  2.                 Field[] fields = obj.getClass().getDeclaredFields();
  3.                 for(Field field : fields){
  4.                         field.setAccessible(true);
  5.                         if(field.getType()==String.class){
  6.                                 String oldValue = (String)field.get(obj);
  7.                                 String newValue = oldValue.replace('b', 'a');
  8.                                 field.set(obj, newValue);
  9.                                 System.out.println(field.get(obj));
  10.                         }
  11.                 }
  12.         }       
复制代码
回复 使用道具 举报
getFields()方法只能获取public修饰的成员变量

getDeclaredFields()方法可以获取所有成员变量,包括private修饰的成员变量
还需要使用setAccessible方法获取访问权限(暴力反射)
回复 使用道具 举报
“因为变量默认类型是public类型的啊,张老师是这样定义的”
我的印象中,没听说过跟你上面说那样,但只听说过默认权限为package,没听过具体到的成员
可以明确一点的是只能反射被public的成分,其它非public的成分必须通过暴力反射
回复 使用道具 举报
谢洋 发表于 2013-3-4 23:41
“因为变量默认类型是public类型的啊,张老师是这样定义的”
我的印象中,没听说过跟你上面说那样,但只听 ...

张老师是这样定义的
public String s = "aabbcc";
public String s1 ="cbcca";
因为变量默认类型是public类型的啊这句话是我认为的,
你别断章取义啊,
看来时我记错了
<default>:(无修饰,有好的)
回复 使用道具 举报
寇弘禄 发表于 2013-3-4 18:46
这个我也试过,貌似通过 getFields()方法只能反射到被public 修饰的字段,而没有被public修饰的字段需要通 ...

知道暴力反射,我翻书了,默认的不是public类型
回复 使用道具 举报
夏晓彤 发表于 2013-3-5 00:09
张老师是这样定义的
public String s = "aabbcc";
public String s1 ="cbcca";

是我的错,我看到张老师离那句话那么近,就以为是他说的
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马