java在反射时候经常用到了 Field 类。
代码:
public class ReflectTest {//需要反射的类
private String fname;
private String lname;
public ReflectTest(String fname, String lname) {
this.fname = fname;
this.lname = lname;
}
public static void main(String[] args) {
try {
ReflectTest rt = new ReflectTest("java", "aspectj");
fun(rt);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void fun(Object obj) throws Exception {
Field[] fields = obj.getClass().getDeclaredFields();//getDeclaredFields()返回Class中所有的字段,包括私有字段;
System.out.println("替换之前的:");
for (Field field : fields) {
System.out.println(field.getName() + "=" + field.get(obj));
if (field.getType().equals(java.lang.String.class)) {//field.getType(): 获取属性声明时类型对象(返回class对象)
field.setAccessible(true);//设置这些属性是可以访问的
// 必须设置为 true 才可以修改成员变量
String org = (String) field.get(obj);//获得此属性的值
field.set(obj, org.replaceAll("a", "b"));
}
}
System.out.println("替换之后的:");
for (Field field : fields) {
System.out.println(field.getName() + "=" + field.get(obj));
}
}
}
//得到一个字段 Field fieldY = pt1.getClass().getField("y"); //y 是变量名 //fieldY的值是5么?? 大错特错 //fieldY和pt1根本没有什么关系,你看,是pt1.getClass(),是 字节码 啊 //不是pt1对象身上的变量,而是类上的,要用它取某个对象上对应的值 //要这样 System.out.println(fieldY.get(pt1)); //这才是5