class.getFields和class.getDeclareFields的区别

Posted yantt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了class.getFields和class.getDeclareFields的区别相关的知识,希望对你有一定的参考价值。

class.getFields的定义

  • 返回类提供的public域包括超类的共有变量;
    注: 是public,我们平时定义变量一般用的private,如果用getFields是不会获得.

class.getDeclareFields的定义

  • 返回类中声明的全部域,其中包括私有和受保护的成员,但是不包括父类的成员.
    注: 与getFields不同的就是getDeclareFields能返回声明中所有定义的成员变量,不管你是私有还是保护的,但是仅限于当前类中的不包括父类的成员.

代码演示

1.定义一个Account类

public class Account {
  private String address;
}

2.定义一个User类继承了Account类

public class User extends Account{

    private  String name;

    private  String sex;

}

3.测试类

public class Test {

    public static void main(String[] args) {
        Class clazz = User.class;
        Field[] fields  = clazz.getFields();
        for (Field field : fields){
            System.out.println("getFields: " + field.getName());
        }
        System.out.println("=====================");
        fields  = clazz.getDeclaredFields();
        for (Field field : fields){
            System.out.println("getDeclaredFields: " + field.getName());
        }

    }
}

4.结果

=====================
getDeclaredFields: name
getDeclaredFields: sex

5.改变Account中address的属性为public并打印

getFields: address
=====================
getDeclaredFields: name
getDeclaredFields: sex

6.改变User中name的属性为public并打印

getFields: name
getFields: address
=====================
getDeclaredFields: name
getDeclaredFields: sex

7.综上基本可以验证定义

  • 如果你想获得一个类的所有成员,需要使用getDeclareFields;
  • 如果你只想获得一个类的所有公有成员,可以使用getFields;但是其中还包括父类的公有成员;那小朋友可能要问了,如果我只想获得当前类的公有成员应该怎么做呢?
  • 我觉得可以用getDeclareFields与getFields取交集即可取出当前类的公有成员;

本篇只是看《Java核心技术卷1》一个随笔记录,与君共勉;



以上是关于class.getFields和class.getDeclareFields的区别的主要内容,如果未能解决你的问题,请参考以下文章

反射之getField()与getDeclaredField()的区别

反射的使用

java反射--Field用法实践

JAVA-反射机制-有无Declared的区别

php __CLASS__get_class()与get_called_class()的区别

获取实例的静态属性