Java通过反射获取Field属性字段

  1. GFather祖先类

    package reflection.second;
    
    public class GFather {
        public int g_age = 1;
        public String g_name = "爷爷";
    
        public GFather(){
    
        }
    }
    
  2. Father父类,并且继承GFather类

    package reflection.second;
    
    public class Father extends GFather{
        private int father_age;
        public String father_name;
        public Father(){
    
        }
        public Father(int father_age, String father_name) {
            this.father_age = father_age;
            this.father_name = father_name;
        }
    
    }
    
  3. Son子类,并且继承Father类。

    package reflection.second;
    
    public class Son extends Father {
    
        private int son_age;
        public String son_name;
    
        public Son(){
    
        }
        public Son(int age, String name) {
            super();
            this.son_age = age;
            this.son_name = name;
        }
    
    }
    

  1. Java一共提供了四种方法接口获取字段,如果权限不够可以使用setAccessible(true)临时将修饰符改为public,这样就可以取到值。

    4.1、getDeclaredField(String name)通过name来获取本类定义的字段; 所有祖先类的属性字段都是无法获取到的。

    @Test
    public void test1(){
        /*
            1. getDeclaredField(String name)   只能获取本类所有的属性字段
            祖先类的字段都无法获取
         */
        Son son = new Son(3,"儿子",2,"爸爸");
        try{
            Field f1 = Class.forName("reflection.second.Son").getDeclaredField("s_age");
            f1.setAccessible(true);
            System.out.println(f1.getName() + " -> " + f1.get(son));
    
            Field f2 = Class.forName("reflection.second.Son").getDeclaredField("f_age");        //权限不够
            f2.setAccessible(true);
            System.out.println(f2.getName() + " -> " + f2.get(son));
    
            Field f3 = Class.forName("reflection.second.Son").getDeclaredField("g_age");        //权限不够
            f3.setAccessible(true);
            System.out.println(f3.getName() + " -> " + f3.get(son));
        } catch (Exception e){
            e.printStackTrace();
        }
    }
    

    在这里插入图片描述

    4.2、getField(String name)通过name指定获取本类 + 祖先类的public字段;但是仅限于public属性字段,所有的非public属性字段是无法获取到的包括本类。

     @Test
    public void test2(){
         /*
             2. 只能获取本类 + 祖先类的public方法
          */
    
         Son son = new Son(3,"儿子",2,"爸爸");
         try{
             Field f1 = Class.forName("reflection.second.Son").getField("s_name");
             Field f2 = Class.forName("reflection.second.Son").getField("f_name");
             Field f3 = Class.forName("reflection.second.Son").getField("g_name");
             System.out.println(f1.getName() + ": " + f1.get(son));
             System.out.println(f2.getName() + ": " + f2.get(son));
             System.out.println(f3.getName() + ": " + f3.get(son));
    
             Field f4 = Class.forName("reflection.second.Son").getField("s_age");        //无法获取
             f4.setAccessible(true);
             System.out.println(f4.getName() + ": " + f4.get(son));
    
         } catch (Exception e){
             e.printStackTrace();
         }
     }
    

    在这里插入图片描述

    4.3、getDeclaredFields() 获取本类定义所有的字段,使用时记得临时提升属性字段的权限,否则会报出异常。

    @Test
        public void test3(){
            /*
                3. 获取本类所有的属性字段。
                注意提升权限,否则会报错说权限不够
             */
            try {
                Son son = new Son(3, "儿子", 2, "爸爸");
                Field[] fields = Class.forName("reflection.second.Son").getDeclaredFields();
                for (Field f : fields) {
                    f.setAccessible(true);
                    System.out.println(f.getName() + " -> " + f.get(son));
                }
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    在这里插入图片描述

    4.4、getFields() 获取本类 + 祖先类所有的public字段;

    @Test
        public void test4(){
            /*
                4. 获取本类 + 祖先类所有的public属性字段
             */
            try{
                Son son = new Son(3, "儿子", 2, "爸爸");
                Field[] SumFields = Class.forName("reflection.second.Son").getFields();
                for(Field f : SumFields){
                    System.out.println(f.getName() + " -> " + f.get(son));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    

    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值