如何通过反射获取类及其父类的私有字段?

Posted

技术标签:

【中文标题】如何通过反射获取类及其父类的私有字段?【英文标题】:How to get the private fields of class and its parent class(es) by reflection? 【发布时间】:2011-08-20 03:33:42 【问题描述】:

我在命名空间域中有类 B 及其父类 A。

A 类,具有私有字段 a; B 类,有私有字段 b;

然后我在命名空间 Reflect 中有一个 Reflection Util。 如果我使用这条线

instanceOfB.GetType().GetFields(BindingFlags.NonPublic 
         | BindingFlags.Public | BindingFlags.Instance );

要查找所有字段(a 和 b),我只得到 b。但是,当我将 a 设为受保护或公开时,我也会找到它们。

我还需要做什么才能找到基类的私有字段?

【问题讨论】:

【参考方案1】:

这是documented behaviour:

指定 BindingFlags.NonPublic 以在搜索中包含非公共字段(即私有、内部和受保护的字段)。仅返回基类上的受保护和内部字段;不返回基类的私有字段。

如果您需要获取私有字段,则需要询问基本类型。 (使用Type.BaseType 查找基本类型,然后调用GetFields。)

【讨论】:

请允许我再问一点:当我通过类层次结构递归时,我如何确保我只获得每个字段(甚至是父级的公共字段)一次?跨度> @Ralph:您可以使用BindingFlags.DeclaredOnly避免从基类继承字段。【参考方案2】:
instanceOfB.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance );

【讨论】:

【参考方案3】:
 public class A
 
     private int aa;
 

 public class B
 
     private int bb;
 

System.Reflection.FieldInfo[] fields = (new B()).GetType().GetFields(BindingFlags.NonPublic| BindingFlags.Public | BindingFlags.Instance);

【讨论】:

先生,按照上面的代码行,我的结果很好。它显示了私有变量。 base 类的私有变量?不应该。 你根本没有给出任何解释——只是代码......它基本上显示了与问题相同的东西,除了你没有让B派生自A。跨度> 我没有看到任何解释。无论如何,“问题”是 B 必须是 A 的派生类。(在你的例子中它不是)

以上是关于如何通过反射获取类及其父类的私有字段?的主要内容,如果未能解决你的问题,请参考以下文章

通过反射获取类的的结构信息

Java反射获取所有私有字段

Java面试题:如何通过反射获取和设置对象私有字段的值?

java中如何通过反射获取类的属性

通过反射动态执行对象的方法的步骤是啥

Java中是不是可以通过反射访问私有字段[重复]