黑马程序员技术交流社区

标题: 反射 [打印本页]

作者: eternallove    时间: 2014-4-28 19:14
标题: 反射
本帖最后由 eternallove 于 2014-4-28 22:37 编辑

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

作者: eternallove    时间: 2014-4-28 19:16
  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. }
复制代码

作者: 随风而去    时间: 2014-4-28 19:39
您这问题出现的根本原因是权限问题 , 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";
        }
}


作者: 执笔梦    时间: 2014-4-28 20:21
楼上正解.

也可以设置FeldDemo属性为public ,
作者: eternallove    时间: 2014-4-28 21:54
随风而去 发表于 2014-4-28 19:39
您这问题出现的根本原因是权限问题 , FieldDemo  你这类的3个属性都是缺省权限 即 是protected 权限
该权 ...

啊哦。。。嗖乃佳,非常的感谢,额知道了。。。




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