我有点搞不懂 getFields
方法和步骤 getDeclaredFields
方法。
我读到了 getDeclaredFields
允许您访问类的所有字段 getFields
仅返回公共字段。如果是这样的话,你为什么不一直用 getDeclaredFields
?
有人能详细说明一下这一点,并解释一下这两种方法之间的区别,以及你什么时候/为什么要用一种方法而不是另一种方法?
我有点搞不懂 getFields
方法和步骤 getDeclaredFields
方法。
我读到了 getDeclaredFields
允许您访问类的所有字段 getFields
仅返回公共字段。如果是这样的话,你为什么不一直用 getDeclaredFields
?
有人能详细说明一下这一点,并解释一下这两种方法之间的区别,以及你什么时候/为什么要用一种方法而不是另一种方法?
4条答案
按热度按时间t2a7ltrp1#
来自java反射教程:
zz2j4svz2#
如前所述,
Class.getDeclaredField(String)
只从远处看田野Class
你称之为。如果你想搜索
Field
在Class
在层次结构中,可以使用以下简单函数:这对于找到一个
private
例如,来自超类的字段。另外,如果要修改其值,可以如下使用:whhtz7ly3#
public Field[] getFields() throws SecurityException
返回一个数组,该数组包含反映该类对象所表示的类或接口的所有可访问公共字段的字段对象。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口没有可访问的公共字段,或者表示数组类、基元类型或void,则此方法返回长度为0的数组。具体地说,如果这个class对象表示一个类,这个方法返回这个类及其所有超类的公共字段。如果这个类对象代表一个接口,这个方法返回这个接口及其所有超接口的字段。
此方法不反映数组类的隐式长度字段。用户代码应该使用类数组的方法来操作数组。
public Field[] getDeclaredFields() throws SecurityException
返回字段对象数组,该数组反映由该类对象表示的类或接口声明的所有字段。这包括public、protected、default(package)access和private字段,但不包括继承的字段。返回的数组中的元素没有排序,也没有任何特定的顺序。如果类或接口未声明任何字段,或者如果此类对象表示基元类型、数组类或void,则此方法返回长度为0的数组。如果我需要所有父类的所有字段呢?需要一些代码,例如https://stackoverflow.com/a/35103361/755804:
yiytaume4#
获取字段()
所有的
public
整个类层次结构中的字段。getdeclaredfields()
所有字段,无论其可访问性如何,但仅适用于当前类,而不是当前类可能继承的任何基类。
为了获取层次结构中的所有字段,我编写了以下函数:
这个
exclusiveParent
类以防止从中检索字段Object
. 可能是的null
如果你真的想要Object
领域。为了澄清,
Lists.newArrayList
来自Guava。更新
仅供参考,上面的代码是在我的libex项目reflectionutils中发布在github上的。