黑马程序员技术交流社区

标题: 反射中获得成员变量的值 [打印本页]

作者: 张敬培    时间: 2013-1-7 23:00
标题: 反射中获得成员变量的值
  1. import java.lang.reflect.Field;

  2. //利用反射把字符串中的a替换成b
  3. public class FrflectFieldDemo {

  4.         public static void main(String[] args) throws Exception{
  5.                 ReflectTest rt = new ReflectTest();
  6.                 Field[] fields = rt.getClass().getFields();
  7.                
  8.                 for(Field field: fields){
  9.                         if(field.getType() == String.class){
  10.                                 String oldStr = (String)field.get(rt);
  11.                                 //String oldStr = (String)field.get(field);//使用field报错
  12.                                 String newStr = oldStr.replace('a', 'b');
  13.                                 System.out.println(newStr);
  14.                         }
  15.                 }
  16.                
  17.         }
  18. }


  19. class ReflectTest {
  20.         public String str1 = "football";
  21.         public String str2 = "pingpangball";
  22.         public String str3 = "haha";

  23.         public ReflectTest(){}

  24.         public String toString(){
  25.                 return str1+":"+str2+":"+str2;
  26.         }
  27. }
复制代码
为什么在获取oldStr时,传入tr能成功,传入field报错


作者: 肖志锋    时间: 2013-1-7 23:25
你可以去查下API,这是Field类的一个方法,public Object get(Object obj) throws IllegalArgumentException,IllegalAccessException,获得参数对象在这个字段的值,如果是基本数据类型,则包装在一个对象里面,所以你那里错了。而且你见过哪个对象有方法是把自己作为参数的吗?
作者: 黄锦成    时间: 2013-1-7 23:52
睡觉之前帮你解决一下吧

String oldStr = (String)field.get(rt);  field是属性,field.get(rt)指的是:你要取得field属性的值,肯定要有对象先存在才能取,那么对象就是rt。get方法传入的是根据field属性所属的字节码new出来的。我一开始学这个,还有Method中的invoke方法,是觉得挺别扭的,但是明白了面向对象设计思想之后,就能明白sun为什么会设计成这样子
作者: ying    时间: 2013-1-8 00:22
本帖最后由 ying 于 2013-1-8 00:32 编辑

  1. <P>package Test;
  2. import java.lang.reflect.Field;
  3. //利用反射把字符串中的a替换成b
  4. public class FrflectFieldDemo {</P>
  5. <P> public static void main(String[] args) throws Exception {

  6.   ReflectTest rt = new ReflectTest();
  7.   Field[] fields = rt.getClass().getFields();</P>
  8. <P>  for (Field field : fields) {
  9.    if (field.getType() == String.class) {
  10.     String oldStr = (String) field.get(rt);
  11.     String newSctr = oldStr.replace('a', 'b');
  12.     System.out.println(newSctr);
  13.    }
  14.   }
  15.   System.out.println("==========================================");
  16.   //获取对象
  17.   ReflectTest  t = new ReflectTest();
  18.   
  19.   change(t);
  20. }
  21. public static void change(Object obj) throws Exception
  22. {
  23.   //获取要操作的类的Class对象
  24.   Class<?> classType = obj.getClass();
  25.   
  26.   //获取对象中的多有成员变量
  27.   Field[] fields = classType.getFields();
  28.   
  29.   //操作成员变量
  30.   for (int i = 0; i < fields.length; i++) {
  31.    //获取第i个成员变量对象
  32.    Field field = classType.getDeclaredField(fields[i].getName());
  33.    //获取对象对应的值
  34.    String fieldValue = field.get(obj).toString();
  35.    
  36.    System.out.println("oldFiledValue: " + fieldValue);
  37.    //压制JVM对字段修饰符的检查
  38.    field.setAccessible(false);
  39.    //替换字段中的“a”为“b”
  40.    String changeValue = fieldValue.replace("a", "b");
  41.    
  42.    System.out.println("newFieldValue:  " + changeValue);
  43.   }
  44. }
  45. }</P>
  46. <P>class ReflectTest {
  47. public String str1 = "football";
  48. public String str2 = "pingpangball";
  49. public String str3 = "haha";</P>
  50. <P> public ReflectTest() {
  51. }</P>
  52. <P> public String toString() {
  53.   return str1 + ":" + str2 + ":" + str2;
  54. }
  55. }</P>
复制代码
你只是获取字段对象的值并做替换,你并没有把替换的结果重新赋值给对象





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