1.Field类代表某个类中的所有成员变量的集合
实例1:
public class ReflectPoint {
private int x;//私有成员变量
public int y; //公有成员变量
public ReflectPoint(int x, int y) {
super();
this.x = x;
this.y = y;
}
}
ReflectPoint pt1 = new ReflectPoint(3, 5); //创建两个实例对象
ReflectPoint pt2 = new ReflectPoint(4, 6);
Field fieldY = ReflectPoint.class.getField("y"); //Field类对象fieldY -----> ReflectPoint 中的 y 成员变量
System.out.println(fieldY.get(pt1)); //输出fieldY.get(pt1)的值,5
System.out.println(fieldY.get(pt2)); //输出fieldY.get(pt2)的值,6
Field fieldX = ReflectPoint.class.getDeclaredField("x");//Field类对象fieldX -----> ReflectPoint 中的x 成员变量,此变量是私有成员,所以用getDeclaredField("x")方法
fieldX.setAccessible(true); //将fieldX变为可见,因为私有成员变量 x 不可见
System.out.println(fieldX.get(pt1)); //输出fieldX.get(pt1)的值,3
System.out.println(fieldX.get(pt2)); //输出fieldX.get(pt2)的值,4
实例2:
public class ReflectPoint {
public String str1 = "ball";
public String str2 = "basketball";
public String str3 = "back";
@Override
public String toString() {
return "ReflectPoint [str1=" + str1 + ", str2=" + str2 + ", str3="
+ str3 + "]";
}
}
private static void changeStringValue(Object obj) throws Exception {//将对象字符串中的'b'字母改为'a'
// TODO Auto-generated method stub
Field [] fields = ReflectPoint.class.getFields();//Field数组
for(Field field:fields){//增强型的for循环
if(field.getType() == String.class){//此处用 == 不用equals(),因为String类型的字节码只有一个
String oldString = (String)field.get(obj);
String newString = oldString.replace('b', 'a');
field.set(obj, newString);//将对象中的String类型成员变量的值变为新的值
}
}
ReflectPoint pt1 = new ReflectPoint(3, 5);
changeStringValue(pt1);
System.out.println(pt1);//输出ReflectPoint [str1=aall, str2=aasketaall, str3=aack]