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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 高阳 中级黑马   /  2013-1-10 16:12  /  1668 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

/*题目:把Person中属性是字符串的内容中啊字符'h'换成'x'
* 已经创建Person类,属性全部私有       
*         private int age;
        private String name;
        private String name2;
        构造器全部私有
        重写了toString方法
*/       
        public static void main(String[] args) throws Exception {       
                //获取Person类的字节码文件
                Class obj=Class.forName("Persosn");
                //我想通过构造器直接赋值,所以需要获取他的构造器对象
                Constructor con=obj.getConstructor(int.class,String.class,String.class);
                //由于构造器是私有的,所以需要暴力访问
                con.setAccessible(true);
                //通过构造器给对象赋值
                Person p=(Person)con.newInstance(12,"haha","hehe");
                Field[]field=obj.getDeclaredFields();
                //遍历所有字段
                for(Field fie:field){
                        //字段全是私有,所以需要暴力访问
                        fie.setAccessible(true);
                        if(fie.getType()==String.class){
                                String s1=(String)fie.get(obj);
                                String s2=s1.replace("h","x");
                                fie.set(obj,s2);
                        }
                }
                System.out.println(p);
        }
会出异常,为什么啊,哪里错了

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1

查看全部评分

3 个回复

倒序浏览
解决了,太不小心了,还有对反射的概念太模糊了
/*题目:把Person中属性是字符串的内容中字符'h'换成'x'
* 已经创建Person类,属性全部私有       
*         private int age;
        private String name;
        private String name2;
        构造器全部私有
        重写了toString方法
*/       
        public static void main(String[] args) throws Exception {       
                //获取Person类的字节码文件
                Class obj=Class.forName("fanshe.Person");
                //我想通过构造器直接赋值,所以需要获取他的构造器对象
                Constructor con=obj.getDeclaredConstructor(int.class,String.class,String.class);
                //由于构造器是私有的,所以需要暴力访问
                con.setAccessible(true);
                //通过构造器给对象赋值
                Person p=(Person)con.newInstance(12,"haha","hehe");
                Field[]field=obj.getDeclaredFields();
                //遍历所有字段
                for(Field fie:field){
                        //字段全是私有,所以需要暴力访问
                        fie.setAccessible(true);
                        if(fie.getType()==String.class){
                                String s1=(String)fie.get(p);
                                String s2=s1.replace("h","x");
                                fie.set(p,s2);
                        }
                }
                System.out.println(p);
        }

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 黄锦成 于 2013-1-10 16:49 编辑

public static void main(String[] args) throws Exception {
   //获取Person类的字节码文件
        Class obj=Class.forName("Person");
      //我想通过构造器直接赋值,所以需要获取他的构造器对象
        Constructor con=obj.getConstructor(int.class,String.class,String.class);
        //由于构造器是私有的,所以需要暴力访问
        con.setAccessible(true);
        //通过构造器给对象赋值
        Person p=(Person)con.newInstance(12,"haha","hehe");
        Field[]field=obj.getDeclaredFields();
        //遍历所有字段
        for(Field fie:field){
                //字段全是私有,所以需要暴力访问
                if(fie.getType()==String.class){
                  fie.setAccessible(true);
                        String s1=(String)fie.get(p);
                        String s2=s1.replace("h","x");
                        fie.set(p,s2);
                }
        }

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
高阳 发表于 2013-1-10 16:32
解决了,太不小心了,还有对反射的概念太模糊了
/*题目:把Person中属性是字符串的内容中字符'h'换成'x'
* ...

把fie.setAccessible(true);放在if语句里面,因为只对是String类型的进行暴力访问,你写在外面,也对int类型变量有作用
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马