当前位置: 首页 > 面试题库 >

如何在Java中通过反射访问父类的父类的私有字段?

金健
2023-03-14
问题内容

在一个API中,我使用的是一个具有 私有字段A.privateField* )的 抽象类Class A )。 B
在API中 扩展了A类 。我需要用我的 类C的 实现来扩展类B
,但是我需要类A的privateField。我应该使用反射:如何访问超超类的私有字段? __

__*

Class A
    - privateField
Class B extends A
Class C extends B
    + method use A.privateField

问题答案:

您需要执行此操作的事实表明设计存在缺陷。

但是,可以按照以下步骤进行操作:

class A
{
  private int privateField = 3;
}

class B extends A
{}

class C extends B
{
   void m() throws NoSuchFieldException, IllegalAccessException
   {
      Field f = getClass().getSuperclass().getSuperclass().getDeclaredField("privateField");
      f.setAccessible(true); // enables access to private variables
      System.out.println(f.get(this));
   }
}

致电:

new C().m();

Andrzej Doyle所说的 “提高类层次结构”的 一种方法如下:

Class c = getClass();
Field f = null;
while (f == null && c != null) // stop when we got field or reached top of class hierarchy
{
   try
   {
     f = c.getDeclaredField("privateField");
   }
   catch (NoSuchFieldException e)
   {
     // only get super-class when we couldn't find field
     c = c.getSuperclass();
   }
}
if (f == null) // walked to the top of class hierarchy without finding field
{
   System.out.println("No such field found!");
}
else
{
   f.setAccessible(true);
   System.out.println(f.get(this));
}


 类似资料:
  • 问题内容: 我找到了一种通过来获取继承成员并通过来获得 ; 私有成员的方法,但是我正在寻找私有的继承字段。我怎样才能做到这一点? 问题答案: 这应该演示如何解决它: (或Class.getDeclaredFields用于所有字段的数组。) 输出:

  • 问题内容: 我正在尝试编写一种使用反射将在类中获取私有字段的方法。 这是我的课程(此示例已简化): 所以说我这样做: 我得到一个因为是私人的。有没有一种方法可以使用反射来获取/设置私有变量?(我已经在C#中完成了,但这是我第一次在Java中尝试过它)。如果您想知道为什么需要这样做:),这是因为有时在单元测试期间,将私有变量设置为虚假值以进行故障测试等很方便。 问题答案: 弄清楚了。需要

  • 问题内容: Java中是否可以通过反射访问私有字段str?例如获取该字段的值。 问题答案: 是。 然后,使用字段对象获取类实例上的值。 请注意,方法通常会使人们感到困惑。你有该字段,但没有该对象的实例。你必须将其传递给方法

  • 我在使用reflections api的公共类中的私有类中使用私有方法时遇到问题。下面是一个简化的代码示例: 同样,我希望能够实例化一个类对象,然后从私有类调用。我一直试图通过反射来做到这一点,但我似乎无法超过1级。此外,内部类可能有也可能没有大多数代码似乎使用的构造函数。上面的代码只是框架。 我当前的代码: 我查找了各种方法来获取内部类或私有方法,但找不到在不使用构造函数的情况下将外部对象获取到

  • 问题内容: 考虑这个例子: 允许您通过反射来访问类的私有字段似乎是不合逻辑的。为什么有这样的功能?允许这样的访问不是“危险”吗? 问题答案: 专用旨在防止意外滥用,而不是作为一种安全机制。如果您选择绕过它,那么您可以自行承担风险,并假设您知道自己在做什么。

  • 问题内容: 我试图使用反射获取不可见类的实例,即AKA包私有类。我想知道是否有一种方法可以切换修饰符以使其公开,然后使用进行访问。当我现在尝试尝试时,它会阻止我说我做不到。不幸的是,没有该类的方法。 问题答案: 嵌套类 -在其他类(包括静态和非静态类)中定义的类 内部类 -非静态嵌套类(内部类的实例需要外部类的实例存在) 非嵌套(顶级)类 根据您的问题,我们知道您要访问的构造函数不是公共的。因此您