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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁胜海 中级黑马   /  2012-12-5 23:58  /  1320 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
class FieldDemo{
String str1="basketBall";
String str2="ball";
String str3="pingpang";

@Override
public String toString() {
  return "str1:"+str1+",str2:"+str2+",str3:"+str3;
}
}
/*
  * 将Field的字符串中的b转换为a
  */
public class FieldClass {
public static void main(String[] args)throws Exception {
  FieldDemo fd=new FieldDemo(3,5);

  changeStringValue(fd);
  System.out.println(fd);
}
/*
  * 将Field的字符串中的b转换为a
  */
public static void changeStringValue(Object obj)throws Exception{
  Field[] fs=FieldDemo.class.getFields();
  for (Field f:fs){
   //判断是否是String的Class对象
   if (f.getType()==String.class){
    String oldValue = (String) f.getName();
    String newValue = oldValue.replace('b', 'a');
    f.set(obj, newValue);
   }
  }
}
}
在这段代码中无论我怎么运行都不能把b替换a,替换不了,我查找了许多遍都没看到哪有不妥,希望哪位大神可以帮忙指定迷津

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

4 个回复

倒序浏览
敢不敢把代码写规范点.使用论坛工具插入代码.你这代码是在记事本里写的么?
我看到FieldDemo fd=new FieldDemo(3,5);
时表示亚历山大.我在FieldDemo 里并位找到其对应的构造器.这个对象是怎么建立的.也没找到Constructor对象.这时我表示已经不懂了.
回复 使用道具 举报
丁桂松 发表于 2012-12-6 05:35
敢不敢把代码写规范点.使用论坛工具插入代码.你这代码是在记事本里写的么?
我看到FieldDemo fd=new FieldDe ...

我只是拷贝了一部分,你把那当做空构造函数把
回复 使用道具 举报
楼主的调试能力有待加强,你的程序编译都不会过

先来看看你的程序的问题

第一个问题,编译错误




把括号里的参数去了,编译过了,现在是第二个问题



没有意外的话,打印的会是 0 ,什么原因呢?




再看看你的





所以你需要这样




然后继续调试




目测结果是这样




问题在于 Field的 getName 方法你应该误解了




我找了下,找到了Field里面的get方法





so




这样再跑,就没有问题了




完整代码如下
  1. package yellowbaby;

  2. import java.lang.reflect.Field;


  3. class FieldDemo {
  4.        
  5.         public String str1 = "basketBall";
  6.         public String str2 = "ball";
  7.         public String str3 = "pingpang";

  8.         @Override
  9.         public String toString() {
  10.                 return "str1:" + str1 + ",str2:" + str2 + ",str3:" + str3;
  11.         }
  12. }

  13. /*
  14. * 将Field的字符串中的b转换为a
  15. */
  16. public class FieldClass {
  17.         public static void main(String[] args) throws Exception {
  18.                 FieldDemo fd = new FieldDemo();
  19.                 changeStringValue(fd);
  20.                 System.out.println(fd);
  21.         }

  22.         /*
  23.          * 将Field的字符串中的b转换为a
  24.          */
  25.         public static void changeStringValue(Object obj) throws Exception {
  26.                 Field[] fs = FieldDemo.class.getFields();

  27.                 //System.out.println(fs.length);

  28.                 for (Field f : fs) {
  29.                         // 判断是否是String的Class对象
  30.                         if (f.getType() == String.class) {
  31.                                
  32.                                 String oldValue = (String) f.get(obj);
  33.                                 String newValue = oldValue.replace('b', 'a');
  34.                                
  35.                                 //System.out.println(oldValue);
  36.                                 //System.out.println(newValue);
  37.                                
  38.                                 f.set(obj, newValue);
  39.                         }
  40.                 }
  41.         }
  42. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

回复 使用道具 举报
黄小贝 发表于 2012-12-6 09:13
楼主的调试能力有待加强,你的程序编译都不会过

先来看看你的程序的问题

感谢,之前我的代码有的没贴完整。我field就差public修饰符没写,我一直苦于无原因,我看了下方法,还真是去所指定的public方法。还有我之前是写get方法的,运行出错才写成getname();总之你牛人啊,反射学的很好啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马