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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© eternallove 中级黑马   /  2014-4-28 19:14  /  1129 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 eternallove 于 2014-4-28 22:37 编辑

哥们帮我看看,这代码到底出什么问题了,为什么运行结果中为什么没变化呢?和老师写的一样的啊!

4 个回复

倒序浏览
  1. import java.lang.reflect.*;
  2. class FieldTest
  3. {
  4.         public static void main(String[] args) throws Exception
  5.         {
  6.                 FieldDemo fd = new FieldDemo();
  7.                 replacetest(fd);
  8.                 System.out.println(fd);
  9.         }
  10.         private static void replacetest(Object obj)throws Exception{
  11.                 Field[] fields = obj.getClass().getFields();
  12.                 for(Field field : fields){
  13.                         if(field.getType() == String.class){
  14.                                 String oldvalue = (String)field.get(obj);
  15.                                 String newvalue = oldvalue.replace('b','a');
  16.                                 field.set(obj,newvalue);
  17.                         }
  18.                 }
  19.                
  20.         }
  21. }
  22. class FieldDemo
  23. {
  24.         String str1 = "ball";
  25.         String str2 = "basketball";
  26.         String str3 = "itcast";
  27.         public String toString(){
  28.                 return "str1"+"-->"+str1+"\n"+"str2"+"-->"+str2+"\n"+"str3"+"-->"+str3+"\n";
  29.         }
  30. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
您这问题出现的根本原因是权限问题 , FieldDemo  你这类的3个属性都是缺省权限 即 是protected 权限
该权限如果不通过暴力反射方式 即 用  .getDeclaredFields()方法是无法获取字段的  只要做点小小的修改就OK
Field[] fields = obj.getClass().getFields();   
这修改成 fields = obj.getClass().getDeclaredFields();即OK

package cn;

import java.lang.reflect.Field;


public class FieldTest
{
        public static void main(String[] args) throws Exception
        {
                FieldDemo fd = new FieldDemo();
                replacetest(fd);
                System.out.println(fd);
        }
        private static void replacetest(Object obj)throws Exception{
                 //你的属性值是protected 反射的时候必须要使用暴力反射 打开反射权限
              //  Field[] fields = obj.getClass().getFields();  
                Field[] fields = obj.getClass().getDeclaredFields();  
                for(Field field : fields){
                        if(field.getType() == String.class){
                                String oldvalue = (String)field.get(obj);
                                String newvalue = oldvalue.replace('b','a');
                                field.set(obj,newvalue);
                        }
                }

        }
}
class FieldDemo
{
        String str1 = "ball";
        String str2 = "basketball";
        String str3 = "itcast";
        public String toString(){
                return "str1"+"-->"+str1+"\n"+"str2"+"-->"+str2+"\n"+"str3"+"-->"+str3+"\n";
        }
}

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
楼上正解.

也可以设置FeldDemo属性为public ,
回复 使用道具 举报
随风而去 发表于 2014-4-28 19:39
您这问题出现的根本原因是权限问题 , FieldDemo  你这类的3个属性都是缺省权限 即 是protected 权限
该权 ...

啊哦。。。嗖乃佳,非常的感谢,额知道了。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马