黑马程序员技术交流社区

标题: 反射中出现的问题 [打印本页]

作者: 夏晓彤    时间: 2013-3-4 18:32
标题: 反射中出现的问题
本帖最后由 夏晓彤 于 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就没被修改,为什么???
作者: 寇弘禄    时间: 2013-3-4 18:46
这个我也试过,貌似通过 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.         }       
复制代码

作者: 吴硕    时间: 2013-3-4 21:08
getFields()方法只能获取public修饰的成员变量

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

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

知道暴力反射,我翻书了,默认的不是public类型
作者: 谢洋    时间: 2013-3-5 00:24
夏晓彤 发表于 2013-3-5 00:09
张老师是这样定义的
public String s = "aabbcc";
public String s1 ="cbcca";

是我的错,我看到张老师离那句话那么近,就以为是他说的




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