黑马程序员技术交流社区

标题: 字段反射中获取获取某一字段在每一具体对象的数值是的... [打印本页]

作者: 燕国庆    时间: 2012-12-3 22:38
标题: 字段反射中获取获取某一字段在每一具体对象的数值是的...
package cn.guoqing.day01;
import java.lang.reflect.*;
public class ReflectTest1 {
/**
  * @param args
  */
public static void main(String[] args) throws Exception {
  Constructor constructor1=String.class.getConstructor(StringBuffer.class);
  String str1=(String) constructor1.newInstance(new StringBuffer("abcde"));
  System.out.println(str1.charAt(3));
  ReflectPoint pt1=new ReflectPoint(3,4);
  Field fieldY=pt1.getClass().getField("y");
//  此时的fieldY的值不是4,因为fieldY不是对象身上的变量,而是类上的(字节码上的变量),要用它去取某个对象上对应的值(通过下面的那行代码)
  int valuey=fieldY.getInt(pt1);
  System.out.println(valuey);
  Field fieldX=pt1.getClass().getDeclaredField("x");//通过getDeclaredFiel()方法获取字段x.(私有的看不见时)
  fieldX.setAccessible(true);//因为成员变量x是私有的,所以要把该字段设置成可获取的                           (看见了拿不到时)
  int valuex=fieldX.getInt(pt1);//获取字段x在pt1对象中的数值。俗称暴力反射。
  System.out.println(valuex);
  
  changeStringValus(pt1);//调用字符替换方法
  System.out.println(pt1);;//打印对象的相关信息
  
}
//定义一个功能,将字符串中一个字符用另外的字符替换
private static void changeStringValus(ReflectPoint pt1) throws Exception {
  Field[] fields=pt1.getClass().getFields();//获取字节码对象中的字段
//  遍历符合条件的字段,并进行字符的替换
  for(Field field:fields){
   if(field.getType()==String.class){
    String oldvalues=(String)field.get(pt1);//在这里为什么要加上一个类型转换 。  get方法中返回的类型:如果该字段是一个基本类型字段,则在返回前将该值包装在一个对象中,否则照原样返回,这句话是什么意思,求指教
    String newvalues=oldvalues.replace('b','a');
    field.set(pt1, newvalues);//设置指定对象中的字段的值
   
   }
   
  }
  
}
}


package cn.guoqing.day01;
public class ReflectPoint {
private int x;
public int y;
public String str2="ball";
public String str3="basseketball";
public String str4="xinlang";
public ReflectPoint(int x, int y) {
  super();
  this.x = x;
  this.y = y;
}
@Override
public String toString() {
  return "ReflectPoint [str2=" + str2 + ", str3=" + str3 + ", str4="
    + str4 + "]";
}


}






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