gpt4 book ai didi

java - Java中如何通过反射访问父类(super class)的父类(super class)的私有(private)字段?

转载 作者:行者123 更新时间:2023-11-30 06:22:53 25 4
gpt4 key购买 nike

在我使用的一个 API 中,我有一个抽象类(A 类),它有一个私有(private)字段(A.私有(private)字段)。 B 类 在 API 中扩展了 A 类。我需要用我的实现扩展 B 类,C 类,但我需要 A 类的 privateField。我应该使用反射:如何访问超父类(super class)的私有(private)字段?

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));
}

关于java - Java中如何通过反射访问父类(super class)的父类(super class)的私有(private)字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18830701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com