首页 > 解决方案 > 如何使用Java访问另一个类的私有字段中的私有字段

问题描述

我很清楚,使用反射可以很容易地访问 Java 中的私有字段。如帖子中所示,如何从 Java 中的不同类读取私有字段的值?而且有很多。

要实现这一点,关键的一步是设置可访问性。

Field f = obj.getClass().getDeclaredField("aaa"); 
f.setAccessible(true);

但就我而言,情况是这样的:

class A{
 private B b;

 class B{
   private String value;
 }
}

我想在另一个类中获得 abvalue 的值。当我尝试时,我打算这样做

A obj = createInstanceA();
Field f = obj.getClass().getDeclaredField("b"); 
f.setAccessible(true);
A.B b = f.get(obj);
Field f2 = b.getClass().getDeclaredField("value");
f2.setAccessible(true);
String value = f2.get(b);

哪个行不通,因为 B 不能从 A 中声明出来。如果不能修改 A 类,我还有其他选择吗?

标签: javaoopreflection

解决方案


你有这样做,

public class A {
    private B b = new B();

    class B {
        private String value = "String";
    }
}

public class ClassB {
    public static void main(String args[]) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{
        A obj = new A();
        Field f = obj.getClass().getDeclaredField("b"); 
        f.setAccessible(true);
        A.B b = (B) f.get(obj);
        Field f2 = b.getClass().getDeclaredField("value");
        f2.setAccessible(true);
        String value = (String) f2.get(b);
        System.out.println(value);
    }
}

您缺少的是 setAccessible(true) 到内部类字段。


推荐阅读