Java 反射读取内部 class 值

Java Reflection to read inner class values

我创建了一个 java class 如下所示:

public class TopNode {
  public Child1 c1;
  public Child2 c2;

public static class Child1 {
  public String s1;
  public String s2;
  }

public static class Child2 {
  public String s3;
  public String s4;
  }
}

这是 class 用于使用 Gson 读取 JSON 响应。如下所示:

static Class<?> readJson(Class<?> obj) throws Exception {
Gson gson = new Gson();
.....
.....
return gson.fromJson(json, obj.getClass());
}

我正在使用上述方法读取 json 响应并将其存储到对象中。

TN_CONFIG

从这个对象,我试图访问内部 class 字段及其值,但只获得空值。示例:

....
....
Field f = TN_CONFIG.getClass().getDeclaredField("c1")
   .getType().getDeclaredField("s1");
System.out.println("S1: " + f.get(new TopNode.Child1());
....

谁能帮我找出哪里出错了?

我认为你的反射代码有问题。 您从 new "empty" Child1 f.get(new TopNode.Child1())

获得价值

看看代码:

public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
    Child1 c1 = new Child1("value1", "value2");
    TopNode node = new TopNode(c1, new Child2("value3", "value4"));
    Field f = node.getClass().getDeclaredField("c1")
            .getType().getDeclaredField("s1");
    System.out.println("S1: " + f.get(c1));
}

输出:

S1: value1

更新,你可以试试下面的代码来获取值:

    Field fieldC1 = TN_CONFIG.getClass().getDeclaredField("c1");
    Object objectC1 = fieldC1.get(TN_CONFIG);
    Field fieldS1 = objectC1.getClass().getDeclaredField("s1");
    Object valueS1 = fieldS1.get(objectC1);
    System.out.println("Value S1 = " +  valueS1);

不确定我是否理解问题,但让我们尝试使用更简单的示例:

class TopNode {
    public Child1 c1;

    public static class Child1 {
        public String s1;
    }
}

假设 TN_CONFIGTopNode 的一个实例(或任何其他具有 c1 的 class 的实例,它本身具有 s1),首先我们需要像

中那样获取 c1 实例
Field fieldC1 = TN_CONFIG.getClass().getDeclaredField("c1");
Object child1 = fieldC1.get(TN_CONFIG);

然后我们就可以得到里面的字段值

Field fieldS1 = fieldC1.getType().getDeclaredField("s1");
Object value = fieldS1.get(child1);

注意:如果 Child1 不是嵌套的 class。

,这也应该有效

注2:fieldC1.getType()可以替换为child1.getClass()