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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Tyson 中级黑马   /  2014-11-21 18:54  /  934 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. package test;

  2. class ReflectPoint {
  3.        
  4.          public String str1="ball";
  5.          public String str2="baskball";
  6.          public String str3="itheim";
  7. @Override
  8. public String toString() {
  9.         return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3=" + str3
  10.                         + "]";
  11. }
  12. }
复制代码
  1. public class ReflectTest {

  2.         public static void main(String[] args) throws Exception{
  3.                 // TODO Auto-generated method stub
  4.                
  5.                 ReflectPoint rp=new ReflectPoint();
  6.                 changeVlaue(rp);
  7.                 System.out.println(rp);
  8.         }

  9.         private static void changeVlaue(Object obj)throws Exception {
  10.                 // TODO Auto-generated method stub
  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.                                
  17.                                 field.set(obj, newValue);
  18.                         }
  19.                        
  20.                 }
  21.         }
  22.        

  23. }
复制代码
请问各位,这个程序里面的ReflectPoint类中的成员为何一定要加public,不然不能将里面的b替换成a!谢谢!



2 个回复

正序浏览
sk0806 发表于 2014-11-21 19:34
因为不加public,是私有的,无法通过反射获取到私有的属性,可以进行调试,如果去掉public
Field [] fields ...

不加public不应该是默认权限的吗?如果是私有的不应该需要加上private的吗?
回复 使用道具 举报
因为不加public,是私有的,无法通过反射获取到私有的属性,可以进行调试,如果去掉public
Field [] fields=obj.getClass().getFields();获得的长度为0,就是没有获取到属性
想要通过反射获取到私有的,必须要通过暴力反射类获取

有错误之处,请大神手下留情,多多指教,自己的见解
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马