Java 反射(Reflection) - Class 类 getField、getFields、getDeclaredField、getDeclaredFields四者区别

1、getField

public Field getField(String name)
    throws NoSuchFieldException, SecurityException 

该方法返回一个 Feild对象,它反映当前 Class对象所表示的类或接口的指定名称的 公共成员字段name 用于指定所需字段的名称。


要反映的字段由下面的算法匹配:  设 C 为 当前Class 对象所表示 的类 或 接口

    1、如果 C 中 声明了一个带有指定名称的公共字段,则它就是要反映的字段。

    2、如果在第 1 步中没有找到任何字段,则该算法被递归地应用于 C 的每一个直接超接口。直接超接口按其声明顺序进行搜索。

    3、如果在第 1、2 两步没有找到任何字段,且 C 有一个超类 S,则在 S 上递归调用该算法。如果 C 没有超类,则抛出NoSuchFieldException


如果这个Class 对象 表示 一个数组类型, 那么该方法不会去查找 这个数组的 length 属性。


2、getFields

public Field[] getFields() throws SecurityException

返回一个包含某些Field 对象的数组,这些Field 对象反映当前 Class 对象所表示的类或接口的所有可访问的公共字段。


如果当前 Class 对象表示一个类,则此方法返回该类及其所有超类、所有实现的接口 中的公共字段。


如果当前 Class 对象表示一个接口,则此方法返回该接口及其所有超接口的所有字段。(1、interface中声明的方法,默认为public访问权限,且仅能为public。2、interface中的成员变量默认为public static final类型。)


如果当前Class 对象所反映的 类或接口没有可访问的公共字段,或者表示一个数组类型、一个基本类型或 void,则此方法返回长度为 0 的数组。


该方法不反映数组的 length 属性 。用户应使用 java.lang.reflect.Array 类 和 数组帮助类 java.util.Arrays 提供的的方法来操作数组。


该方法返回的Feild数组中的元素没有排序,也没有任何特定的顺序。


3、getDeclaredField

public Field getDeclaredField(String name)
    throws NoSuchFieldException, SecurityException

返回一个 Field 对象,该Field对象反映当前Class 对象所表示的类或接口中 指定名称的 并且在该类中声明的字段。name参数  指定已声明字段的名称


可以获取public 、protected 、缺省 、private 修饰的字段,但该字段必须在当前类或接口中 存在 声明。从父类继承的字段无法获取,会报 java.lang.NoSuchFieldException


此方法不反映数组的 length 字段。


4、getDeclaredFields

public Field[] getDeclaredFields() throws SecurityException

返回 Field 对象的一个数组,这些Field 对象反映当前 Class 对象所表示的类或接口中 所声明的所有字段。包括公共、保护、默认(包级私有)和私有字段,但不包括继承的字段。(继承的字段,在当前类中不存在声明。)


如果当前Class 对象 表示 的类 或 接口 中 未声明任何字段,则返回一个长度为0的数组。


如果当前Class对象 表示一个基本类型、一个数组类型 或 void,则此方法返回一个长度为 0 的数组。


返回的Field 数组中的元素没有排序,也没有任何特定的顺序。

你可能感兴趣的:(java)