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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 戒爱 中级黑马   /  2014-3-12 11:44  /  969 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 戒爱 于 2014-3-12 12:23 编辑

(反射)两个问题请指教:1、//此处获得元素为什么是field而不是fields[field],获取数组元素不是-->数组名[角标]吗?2、/打印结果没有成功修改,哪里出问题了?

  1. import java.lang.reflect.*;

  2. enum Sex {
  3.         MAN, WOMAN
  4. }

  5. class Person {
  6.         String name;
  7.         Sex sex;
  8.         public Person(String name, Sex sex){
  9.                 this.name = name;
  10.                 this.sex = sex;
  11.         }
  12.         public String toString() {
  13.                 return this.name+"--"+this.sex;
  14.         }
  15. }

  16. public class Student{
  17.         public static void main(String[] args) throws Exception {
  18.                 Person p = new Person("zhangsan", Sex.MAN);
  19.                
  20.                 Field[] fields = p.getClass().getFields();
  21.                 for(Field field : fields){
  22.                         //此处获得元素为什么是field而不是fields[field],获取数组元素不是-->数组名[角标]吗?
  23.                         if(field.getType() == String.class){
  24.                                 String oldValue = (String) field.get(p);
  25.                                 String newValue = oldValue.replace('h', 'z');
  26.                                 field.set(p, newValue);
  27.                         }
  28.                 }
  29.                 System.out.println(p);        //打印结果没有成功修改,哪里出问题了?
  30.         }
  31. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

5 个回复

倒序浏览
第一个问题 高级for啊 不会这个也忘了吧
第二个问题 把Field[] fields = p.getClass().getFields();改成Field[] fields = p.getClass().getDeclaredFields();就好了

评分

参与人数 1黑马币 +3 收起 理由
戒爱 + 3 很给力!

查看全部评分

回复 使用道具 举报 1 0
setAccessible(true);   String oldValue = (String) field.get(p);  加上这句试试   setAccessible可以取消去java语言访问检查。

评分

参与人数 1黑马币 +3 收起 理由
戒爱 + 3 赞一个!

查看全部评分

回复 使用道具 举报 1 0
ixiangfeng 发表于 2014-3-12 12:01
第一个问题 高级for啊 不会这个也忘了吧
第二个问题 把Field[] fields = p.getClass().getFields();改成Fie ...

搞懂了,多谢
回复 使用道具 举报
榨菜 发表于 2014-3-12 12:23
setAccessible(true);   String oldValue = (String) field.get(p);  加上这句试试   setAccessible可以取 ...

字段值又不是private用暴力反射有什么用啊 他这里的问题是因为name和sex两个成员变量修饰符为default 是根本就取不到的 要么用getDeclaredField方法,要么把修饰符改为public
回复 使用道具 举报
本帖最后由 胡文彬 于 2014-3-12 21:44 编辑

问题出现在 第23行,

[size=-1]Field[]
getFields()
          返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。



你可以吧name的访问修饰符改成public ,或者把getFilelds(),改成getDeclaredFiled()

评分

参与人数 1黑马币 +3 收起 理由
戒爱 + 3 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马