Java 为什么ClassName.class.getFields()只返回公共字段?

Java 为什么ClassName.class.getFields()只返回公共字段?,java,Java,我有一个甲级 public class A { String host = "localhost"; public String port = "8078"; protected String preFix = "www."; private String postFix = "/uploads"; } 我使用下面的代码获取A类的字段详细信息 public static void main(String[] args) { Field[] fie

我有一个甲级

public class A {
    String host = "localhost";
    public String port = "8078";
    protected String preFix = "www.";
    private String postFix = "/uploads";
}
我使用下面的代码获取A类的字段详细信息

public static void main(String[] args) {
        Field[] fields = A.class.getFields();
        System.out.println("fields are:" + Arrays.toString(fields));
    }
输出是

fields are:[public java.lang.String org.test.A.port]
我知道getFields()方法只返回那些使用公共访问说明符声明的字段

但是为什么Java实现了getFields() 像这样吗?


Java团队实现这种实现的主要目的是什么?
getFields
的目的是通过类返回所有可用的公共字段,包括继承的字段


如果您正在查找此类中声明的字段列表,请使用
getDeclaredFields

,因为有
getDeclaredFields
返回字段,而不考虑其修饰符,您的问题没有意义。重点是为所有常见的用例提供方法。例如,使用
getFields
可以迭代一个只包含常量的
静态类(这是在引入
enum
s之前)。因此,为了回答您的问题,这部分是为了涵盖常见用例,现在部分是遗留的。

类中有两种方法与字段相关:

  • 返回此字段的所有可公开访问的字段 类(接口)及其所有超类
  • 返回 在此类(接口)上声明的所有字段,包括带有 公共、默认、受保护和私有可见性

这两种方法用例之间的区别应该非常清楚。

您是否在寻找
getDeclaredFields()
?您可能想看看。如果它方便地返回私有和受保护的字段,这不是一个安全问题吗???@Abishemanoharan带反射,您通常可以访问所有内容。修饰符可以看作是提示,而不是绝对值。仅仅因为某些东西被声明为私有,并不意味着JVM会采取任何措施来“保护”这个属性/方法。@Turing85:JVM会注意的。如果您请求非
公共
成员,将请求
安全管理器
(如果已安装)的权限。如果未安装,则getDeclaredFields可以引发SecurityExceptionmistaken@Davio
getFields()
也可能引发
SecurityException