java反射

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  
原文地址:https://www.cnblogs.com/zhaoleigege/p/5695771.html