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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 惠晖 中级黑马   /  2012-12-24 19:05  /  1296 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 惠晖 于 2012-12-24 19:31 编辑

public class ReflectTest {
        private int x;
        private int y;
        String str1 = "ball";
        String str2 = "basketball";
        String str3 = "kajf";

        ReflectTest(int x, int y) {
                this.x = x;
                this.y = y;
        }

        public String toString() {
                return str1 + str2 + str3;

        }

}
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectHello {

        /**
         * @param argsd
         * @throws IllegalAccessException
         * @throws IllegalArgumentException
         */
        public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException {
                ReflectTest p1 = new ReflectTest(2, 3);
                changeStringValue(p1);
                System.out.println(p1);
        }

        public static void changeStringValue(Object obj) throws IllegalArgumentException, IllegalAccessException {

                Field[] fields = obj.getClass().getFields();
                for (int x = 0; x< fields.length;x++) {
                        if (fields[x].getType() == String.class) {
                                String oldValue = (String) fields[x].get(obj);
                                String newValue = oldValue.replace('b', 'a');
                                fields[x].set(obj, newValue);

                        }

                }
        }
}
为什么 打印出来还是原来的字符串 没有把b换成a

评分

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

查看全部评分

5 个回复

倒序浏览
本帖最后由 李桐 于 2012-12-24 20:03 编辑

没有设定修饰符,,字段设成public就行
回复 使用道具 举报
本帖最后由 王进亮 于 2012-12-24 21:07 编辑

你的string str1,str2,str3为默认的有变量,正常反射得不到对象中的私有变量,这时需要暴力反射,Field[] f=pt1.getClass().getDeclaredFields();
Field[]fields=obj.getClass().getFields();
Field[] f=obj.getClass().getDeclaredFields();

    for (int i = 0; i < fields.length; i++) {
    if(fields.getType()==String.class){
    String oldValue=(String)fields.get(obj);
    String newValue=oldValue.replace('b','a');
    fields.set(obj, newValue);
   

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 惠晖 于 2012-12-24 19:32 编辑
王进亮 发表于 2012-12-24 19:24
你的string str1,str2,str3为私有变量,正常反射得不到对象中的私有变量,这时需要暴力反射,Field[] f=pt1 ...


我明明是默认的 不是私有的啊   怎么也会访问不到呢???  String 前面没有私有修饰符哎  是默认也不行么
回复 使用道具 举报
惠晖 发表于 2012-12-24 19:30
我明明是默认的 不是私有的啊   怎么也会访问不到呢???  String 前面没有私有修饰符哎  是默认也不行 ...

friendly 友好(默认的):此时只允许同一个包内的类访问
回复 使用道具 举报
王进亮 发表于 2012-12-24 21:07
friendly 友好(默认的):此时只允许同一个包内的类访问

我测试了下 一个包里面也不行啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马