class.getDeclaredFields()与class.getFields()

* getFields()与getDeclaredFields()区别:getFields()只能访问类中声明为公有的字段,私有的字段它无法访问.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关  

* getMethods()与getDeclaredMethods()区别:getMethods()只能访问类中声明为公有的方法,私有的方法它无法访问,能访问从其它类继承来的公有方法.getDeclaredFields()能访问类中所有的字段,与public,private,protect无关,不能访问从其它类继承来的方法  

* getConstructors()与getDeclaredConstructors()区别:getConstructors()只能访问类中声明为public的构造函数.getDeclaredConstructors()能访问类中所有的构造函数,与public,private,protect无关 

package test;

public class Point1 {
    private int x;
    public int y;
    public String a="asdasd";
    public Point1() {}
    public Point1(int i, int j) {
        super();
        this.x=i;
        this.y=j;
    }
}
public class fieldTest {
    public static void main(String[] args) throws  Exception {
        Point1 point=new Point1(5, 10);
        Field fieldY=point.getClass().getField("y");      //  y字段公有
        System.out.println(fieldY);
        System.out.println(fieldY.get(point));
        
        Field fieldX=point.getClass().getDeclaredField("x");   //x字段私有
        fieldX.setAccessible(true);                            //AccessibleTest类中的成员变量为private,故必须进行此操作  
        System.out.println(fieldX.get(point));                 //如果没有在获取Field之前调用setAccessible(true)方法,异常
        
        Point1 point2=new Point1();
        
        Field[] fields=point.getClass().getFields();          //把Point1函数中的String字段做改动
        for(Field field:fields) {                           
            if (field.getType()==String.class) {              
                String oldValue =(String) field.get(point2);          
                String newVaule =oldValue.replace('a', 'b');
                field.set(point2, newVaule);
                System.out.println(field.get(point2));
            }
        }
        
    }
}
输出结果
public int test.Point1.y
10
5
bsdbsd

 

posted @ 2017-11-03 13:47  七千米蔚蓝  阅读(8814)  评论(0编辑  收藏  举报