java Field 反射

ava 反射field 测试
tank类
Java代码  收藏代码

    package ReflectJava; 
     
    public class Tank { 
         
        private  int x = 4; 
        public  int y = 5; 
         
        public Tank(int x, int y) { 
            super(); 
            this.x = x; 
            this.y = y; 
        } 
         
         
        public int getX() { 
            return x; 
        } 
     
     
        public void setX(int x) { 
            this.x = x; 
        } 
     
     
        public int getY() { 
            return y; 
        } 
     
     
        public void setY(int y) { 
            this.y = y; 
        } 
     
     
        public Tank(){ 
             
        } 
        public int add(){ 
             
            return 4; 
             
        } 
        private void bdd(){ 
             
            System.out.println("私有方法步能访问哦 亲!!"); 
             
        } 
        private  void cdd(int x,int y){ 
             
            System.out.println(" 亲!!"); 
             
        } 
     
    } 


-----------------------tank父类-----------------------------------
Java代码  收藏代码

    package ReflectJava; 
     
    public class SuperTank { 
     
        private int z = 0; 
        public int x = 3; 
         
         
        public SuperTank() { 
            super(); 
            // TODO Auto-generated constructor stub 
        } 
     
     
        public SuperTank(int z, int x) { 
            super(); 
            this.z = z; 
            this.x = x; 
        } 
         


///------------------测试类----------------------------------------
Java代码  收藏代码

    package ReflectJava; 
     
    import java.lang.reflect.Field; 
     
    public class Test1 { 
     
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, SecurityException, NoSuchFieldException { 
            Class t = Tank.class; 
            Tank t1 = new Tank(); 
             
             
            Field f = t.getDeclaredField("x"); //得到单一属性方法(公有,私有,保护的都可以) 
            System.out.println("getDeclaredField 得到的属性----"+f); 
             
            Field fk = t.getField("y"); //得到单一属性方法(只能为公有的) 
            System.out.println("getField得到的属性-----"+fk); 
             
             
            Field[] fs = t.getDeclaredFields();// 得到该类所有声明的属性(公有,保护,私有都可以) 
             
            System.out.println("------GET DeclareFields方法得到的属性值------"); 
            for(Field ff: fs) 
            { 
                 
                System.out.println(ff); 
            } 
             
            System.out.println("------GET fields()--方法得到的属性值------"); 
             
            Field[] fss = t.getFields(); // 得到该类的所有属性包括其父类的属性(但只能是公有的) 
            for(Field ff1: fss) 
            { 
              
                System.out.println(ff1); 
                 
            } 
         
             
        fk.set(t1, 6); // 调用field 的set方法可以往里面设值 而不需要new 该对象去set值了  
         
        System.out.println("通过fk.set(t1, 6)方法后,tank 属性由3变成  "+t1.getY()); 
         
             
             
        } 
     
    } 
    ------------------------------测试结果------------------------------- 
    [code="text/code] 
    getDeclaredField 得到的属性----protected int ReflectJava.Tank.x 
    getField得到的属性-----public int ReflectJava.Tank.y 
    ------GET DeclareFields方法得到的属性值------ 
    protected int ReflectJava.Tank.x 
    public int ReflectJava.Tank.y 
    ------GET fields()--方法得到的属性值------ 
    public int ReflectJava.Tank.y 
    public int ReflectJava.SuperTank.z 
    public int ReflectJava.SuperTank.x 
    通过fk.set(t1, 6)方法后,tank 属性由3变成  6 



通过测试总结:
getFiled: 访问公有的属性

getDeclaredField:所有已声明的属性。但得不到其父类的属性

getFilds:访问所有的属性只能为公有的,注意当子类的属性和父类的属性相同时,如果都为 int x;则子类的Class对象.fields(x) 会访问子类的属性x,如果子类的属性是私有地,或者是保护类型的,则就会去访问父类的x属性了。

getDeclaredFieldgetDeclaredFields:得到该类所有已声明的属性

简单2句:field 只能访问公有的。
      DeclaredField 访问所有权限的。

猜你喜欢

转载自kuchawyz.iteye.com/blog/2107303