在 Java 中通过反射访问私有继承字段

新手上路,请多包涵

我找到了一种通过 --- 获取继承成员并通过 class.getDeclaredFields(); 访问私有成员的 class.getFields() 但我正在寻找私有继承字段。我怎样才能做到这一点?

原文由 benzen 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 935
2 个回答

事实上,我使用了一个复杂的类型层次结构,所以你的解决方案并不完整。我需要进行递归调用以获取所有私有继承字段。这是我的解决方案

 /**
 * Return the set of fields declared at all level of class hierachy
 */
public static List<Field> getAllFields(Class<?> clazz) {
    return getAllFieldsRec(clazz, new ArrayList<>());
}

private static List<Field> getAllFieldsRec(Class<?> clazz, List<Field> list) {
    Class<?> superClazz = clazz.getSuperclass();
    if (superClazz != null) {
        getAllFieldsRec(superClazz, list);
    }
    list.addAll(Arrays.asList(clazz.getDeclaredFields()));
    return list;
}

原文由 benzen 发布,翻译遵循 CC BY-SA 4.0 许可协议

这应该演示如何解决它:

 import java.lang.reflect.Field;

class Super {
    private int i = 5;
}

public class B extends Super {
    public static void main(String[] args) throws Exception {
        B b = new B();
        Field f = b.getClass().getSuperclass().getDeclaredField("i");
        f.setAccessible(true);
        System.out.println(f.get(b));
    }
}

(或 Class.getDeclaredFields 用于所有字段的数组。)

输出:

 5

原文由 aioobe 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题